{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "AE_RL_awid.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "toc_visible": true,
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/gcamfer/Anomaly-ReactionRL/blob/master/Notebooks/AE_RL_awid.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "metadata": {
        "id": "xRc2RK-glYlb",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "#AE-RL for AWID"
      ]
    },
    {
      "metadata": {
        "id": "FEFO4mGvbnlF",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "e0fde6b6-53b2-419b-a411-af0ff8a79562"
      },
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "from keras.models import Sequential\n",
        "from keras.layers import Dense\n",
        "from keras import optimizers\n",
        "from keras import backend as K\n",
        "import json\n",
        "from sklearn.utils import shuffle\n",
        "import os\n",
        "import sys\n",
        "import time\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import classification_report, f1_score, accuracy_score,recall_score, precision_score"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Using TensorFlow backend.\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "metadata": {
        "id": "82_fPY7rlX-e",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Using dataset from google drive"
      ]
    },
    {
      "metadata": {
        "id": "wWKDizH_ZqiK",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "from google.colab import drive\n",
        "drive.mount('/content/gdrive')"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "WFrMypLUaXK_",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Dataset path"
      ]
    },
    {
      "metadata": {
        "id": "G54yYRK3bhde",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 84
        },
        "outputId": "b1460377-4f00-46d9-a729-92c93730cc10"
      },
      "cell_type": "code",
      "source": [
        "!tar -xvzf \"/content/gdrive/My Drive/my_datasets/AWID-CLS-R-Trn.tar.gz\"\n",
        "!tar -xvzf \"/content/gdrive/My Drive/my_datasets/AWID-CLS-R-Tst.tar.gz\""
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "AWID-CLS-R-Trn/\n",
            "AWID-CLS-R-Trn/1\n",
            "AWID-CLS-R-Tst/\n",
            "AWID-CLS-R-Tst/1\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "xHxe_kZtiQcD",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "99f04b2b-838e-41f5-d2aa-406dde41e943"
      },
      "cell_type": "code",
      "source": [
        "!mkdir splitted\n",
        "\n",
        "train_path = \"splitted/train.csv\"\n",
        "test_path = \"splitted/test.csv\""
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "mkdir: cannot create directory ‘splitted’: File exists\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "wUy5UJdSftEA",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "names = [\"frame.interface_id\" ,\"frame.dlt\" ,\"frame.offset_shift\",\"frame.time_epoch\" ,\n",
        "        \"frame.time_delta\" ,\"frame.time_delta_displayed\" ,\"frame.time_relative\" ,\n",
        "         \"frame.len\" ,\"frame.cap_len\" ,\"frame.marked\" ,\"frame.ignored\" ,\"radiotap.version\" ,\n",
        "    \"radiotap.pad\" ,\"radiotap.length\" ,\"radiotap.present.tsft\" ,\"radiotap.present.flags\" ,\"radiotap.present.rate\" ,\n",
        "    \"radiotap.present.channel\" ,\"radiotap.present.fhss\" ,\"radiotap.present.dbm_antsignal\" ,\"radiotap.present.dbm_antnoise\" ,\n",
        "    \"radiotap.present.lock_quality\" ,\"radiotap.present.tx_attenuation\" ,\"radiotap.present.db_tx_attenuation\" ,\n",
        "    \"radiotap.present.dbm_tx_power\" ,\"radiotap.present.antenna\" ,\"radiotap.present.db_antsignal\" ,\"radiotap.present.db_antnoise\" ,\n",
        "    \"radiotap.present.rxflags\" ,\"radiotap.present.xchannel\" ,\"radiotap.present.mcs\" ,\"radiotap.present.ampdu\" ,\"radiotap.present.vht\" ,\n",
        "    \"radiotap.present.reserved\" ,\"radiotap.present.rtap_ns\" ,\"radiotap.present.vendor_ns\" ,\"radiotap.present.ext\" ,\n",
        "    \"radiotap.mactime\" ,\"radiotap.flags.cfp\" ,\"radiotap.flags.preamble\" ,\"radiotap.flags.wep\" ,\"radiotap.flags.frag\" ,\n",
        "    \"radiotap.flags.fcs\" ,\"radiotap.flags.datapad\" ,\"radiotap.flags.badfcs\" ,\"radiotap.flags.shortgi\" ,\"radiotap.datarate\" ,\n",
        "    \"radiotap.channel.freq\" ,\"radiotap.channel.type.turbo\" ,\"radiotap.channel.type.cck\" ,\"radiotap.channel.type.ofdm\" ,\n",
        "    \"radiotap.channel.type.2ghz\" ,\"radiotap.channel.type.5ghz\" ,\"radiotap.channel.type.passive\" ,\"radiotap.channel.type.dynamic\" ,\n",
        "    \"raÇdiotap.channel.type.gfsk\" ,\"radiotap.channel.type.gsm\" ,\"radiotap.channel.type.sturbo\" ,\"radiotap.channel.type.half\" ,\n",
        "    \"radiotap.channel.type.quarter\" ,\"radiotap.dbm_antsignal\" ,\"radiotap.antenna\" ,\"radiotap.rxflags.badplcp\" ,\"wlan.fc.type_subtype\" ,\n",
        "    \"wlan.fc.version\" ,\"wlan.fc.type\" ,\"wlan.fc.subtype\" ,\"wlan.fc.ds\" ,\"wlan.fc.frag\" ,\"wlan.fc.retry\" ,\"wlan.fc.pwrmgt\" ,\n",
        "    \"wlan.fc.moredata\" ,\"wlan.fc.protected\" ,\"wlan.fc.order\" ,\"wlan.duration\" ,\"wlan.ra\" ,\"wlan.da\" ,\"wlan.ta\" ,\"wlan.sa\" ,\n",
        "    \"wlan.bssid\" ,\"wlan.frag\" ,\"wlan.seq\" ,\"wlan.bar.type\" ,\"wlan.ba.control.ackpolicy\" ,\"wlan.ba.control.multitid\" ,\n",
        "    \"wlan.ba.control.cbitmap\" ,\"wlan.bar.compressed.tidinfo\" ,\"wlan.ba.bm\" ,\"wlan.fcs_good\" ,\"wlan_mgt.fixed.capabilities.ess\" ,\n",
        "    \"wlan_mgt.fixed.capabilities.ibss\" ,\"wlan_mgt.fixed.capabilities.cfpoll.ap\" ,\"wlan_mgt.fixed.capabilities.privacy\" ,\n",
        "    \"wlan_mgt.fixed.capabilities.preamble\" ,\"wlan_mgt.fixed.capabilities.pbcc\" ,\"wlan_mgt.fixed.capabilities.agility\" ,\n",
        "    \"wlan_mgt.fixed.capabilities.spec_man\" ,\"wlan_mgt.fixed.capabilities.short_slot_time\" ,\"wlan_mgt.fixed.capabilities.apsd\" ,\n",
        "    \"wlan_mgt.fixed.capabilities.radio_measurement\" ,\"wlan_mgt.fixed.capabilities.dsss_ofdm\" ,\"wlan_mgt.fixed.capabilities.del_blk_ack\" ,\n",
        "    \"wlan_mgt.fixed.capabilities.imm_blk_ack\" ,\"wlan_mgt.fixed.listen_ival\" ,\"wlan_mgt.fixed.current_ap\" ,\"wlan_mgt.fixed.status_code\" ,\n",
        "    \"wlan_mgt.fixed.timestamp\" ,\"wlan_mgt.fixed.beacon\" ,\"wlan_mgt.fixed.aid\" ,\"wlan_mgt.fixed.reason_code\" ,\"wlan_mgt.fixed.auth.alg\" ,\n",
        "    \"wlan_mgt.fixed.auth_seq\" ,\"wlan_mgt.fixed.category_code\" ,\"wlan_mgt.fixed.htact\" ,\"wlan_mgt.fixed.chanwidth\" ,\n",
        "    \"wlan_mgt.fixed.fragment\" ,\"wlan_mgt.fixed.sequence\" ,\"wlan_mgt.tagged.all\" ,\"wlan_mgt.ssid\" ,\"wlan_mgt.ds.current_channel\" ,\n",
        "    \"wlan_mgt.tim.dtim_count\" ,\"wlan_mgt.tim.dtim_period\" ,\"wlan_mgt.tim.bmapctl.multicast\" ,\"wlan_mgt.tim.bmapctl.offset\" ,\n",
        "    \"wlan_mgt.country_info.environment\" ,\"wlan_mgt.rsn.version\" ,\"wlan_mgt.rsn.gcs.type\" ,\"wlan_mgt.rsn.pcs.count\" ,\n",
        "    \"wlan_mgt.rsn.akms.count\" ,\"wlan_mgt.rsn.akms.type\" ,\"wlan_mgt.rsn.capabilities.preauth\" ,\"wlan_mgt.rsn.capabilities.no_pairwise\" ,\n",
        "    \"wlan_mgt.rsn.capabilities.ptksa_replay_counter\" ,\"wlan_mgt.rsn.capabilities.gtksa_replay_counter\" ,\"wlan_mgt.rsn.capabilities.mfpr\" ,\n",
        "    \"wlan_mgt.rsn.capabilities.mfpc\" ,\"wlan_mgt.rsn.capabilities.peerkey\" ,\"wlan_mgt.tcprep.trsmt_pow\" ,\"wlan_mgt.tcprep.link_mrg\" ,\n",
        "    \"wlan.wep.iv\" ,\"wlan.wep.key\" ,\"wlan.wep.icv\" ,\"wlan.tkip.extiv\" ,\"wlan.ccmp.extiv\" ,\"wlan.qos.tid\" ,\"wlan.qos.priority\" ,\n",
        "    \"wlan.qos.eosp\" ,\"wlan.qos.ack\" ,\"wlan.qos.amsdupresent\" ,\"wlan.qos.buf_state_indicated\" ,\"wlan.qos.bit4\" ,\n",
        "    \"wlan.qos.txop_dur_req\" ,\"wlan.qos.buf_state_indicated\" ,\"data.len\" ,\"class\"]"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "-DUODMU5ltL6",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Load the unique features used"
      ]
    },
    {
      "metadata": {
        "id": "rBeqlxB1Hptv",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "colnames_good_df = pd.read_csv(\"/content/gdrive/My Drive/my_datasets/Awid/colnames_good.csv\",names=[\"colnames\"])\n",
        "colnames_good = colnames_good_df['colnames'].tolist()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "lJlWn4BtcZx4",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 70
        },
        "outputId": "a0ba8945-3a51-4bbc-e0f0-b4081465e7e2"
      },
      "cell_type": "code",
      "source": [
        "train = pd.read_csv(\"AWID-CLS-R-Trn/1\", names=names, usecols=colnames_good)"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/pandas/io/parsers.py:709: UserWarning: Duplicate names specified. This will raise an error in the future.\n",
            "  return _read(filepath_or_buffer, kwds)\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "metadata": {
        "id": "p54-dQO336F7",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 70
        },
        "outputId": "365a8c56-365e-4661-e157-9e9ae13950f3"
      },
      "cell_type": "code",
      "source": [
        "test = pd.read_csv(\"AWID-CLS-R-Tst/1\", names=names, usecols=colnames_good)"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/pandas/io/parsers.py:709: UserWarning: Duplicate names specified. This will raise an error in the future.\n",
            "  return _read(filepath_or_buffer, kwds)\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "metadata": {
        "id": "CFVq5S4xBcXY",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Preprocessing"
      ]
    },
    {
      "metadata": {
        "id": "JoujDQHTQ2OD",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 50
        },
        "outputId": "13185b12-c23c-4a91-f5e6-824a8d0fe0a5"
      },
      "cell_type": "code",
      "source": [
        "print(train.shape)\n",
        "print(test.shape)"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(1795575, 49)\n",
            "(575643, 49)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "54infFBHBC0h",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 84
        },
        "outputId": "24bbe447-55d7-44ea-a414-157dbbb463c5"
      },
      "cell_type": "code",
      "source": [
        "train_indx = train.shape[0]\n",
        "\n",
        "df = train.append(test, ignore_index=True)\n",
        "\n",
        "# Remove labels column\n",
        "labels = df['class']\n",
        "df = df.drop('class',axis=1)\n",
        "\n",
        "print(\"Dataset without labels shape:{}\".format(df.shape))\n",
        "\n",
        "\n",
        "# Processing categorical and numerical columns\n",
        "num_cols = list(df._get_numeric_data().columns)\n",
        "cat_cols = list(set(df.columns)-set(num_cols))\n",
        "\n",
        "\n",
        "# Normalization of the df\n",
        "#log_cols = self.df.filter(like='logarithm').columns\n",
        "#nat_cols =  list(set(self.df.columns)-set(log_cols))\n",
        "#self.df.reset_index()\n",
        "df[num_cols] = (df[num_cols]-df[num_cols].min())/(df[num_cols].max()-df[num_cols].min())\n",
        "\n",
        "\n",
        "for name_col in cat_cols:\n",
        "    df = pd.concat([df.drop(name_col, axis=1), pd.get_dummies(df[name_col],prefix=name_col)], axis=1)\n",
        "\n",
        "print(\"Dataset with categoricals encoded:{}\".format(df.shape))\n",
        "\n",
        "# If na max and min = 0 so delete column\n",
        "df = df.dropna(axis=1)\n",
        "\n",
        "# Delete row\n",
        "#self.df = self.df.dropna(axis=0)\n",
        "print(\"Dataset dropping nan:{}\".format(df.shape))\n",
        "\n",
        "# Add labels again\n",
        "df['labels']=labels\n",
        "\n",
        "\n",
        "print(\"Dataset with labels again:{}\".format(df.shape))\n",
        "\n",
        "\n",
        "train = df.iloc[:train_indx]\n",
        "test = df.iloc[train_indx:]"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Dataset without labels shape:(2371218, 48)\n",
            "Dataset with categoricals encoded:(2371218, 70)\n",
            "Dataset dropping nan:(2371218, 46)\n",
            "Dataset with labels again:(2371218, 47)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "doAyeUMdxL7G",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 50
        },
        "outputId": "695ec170-bc0e-45e6-9a0b-a2fe4ca53305"
      },
      "cell_type": "code",
      "source": [
        "print(train.shape)\n",
        "print(test.shape)"
      ],
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(1795575, 47)\n",
            "(575643, 47)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "Pj8-UQ5_ypLe",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "train.to_csv(train_path,index=False)\n",
        "test.to_csv(test_path,index=False)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "5H_JmUZtceEN",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 890
        },
        "outputId": "85207a1d-afc3-4f32-d260-665ff72634e5"
      },
      "cell_type": "code",
      "source": [
        "train.info()"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "<class 'pandas.core.frame.DataFrame'>\n",
            "RangeIndex: 1795575 entries, 0 to 1795574\n",
            "Data columns (total 47 columns):\n",
            "frame.time_epoch                        float64\n",
            "frame.time_delta                        float64\n",
            "frame.time_delta_displayed              float64\n",
            "frame.time_relative                     float64\n",
            "frame.len                               float64\n",
            "frame.cap_len                           float64\n",
            "radiotap.length                         float64\n",
            "radiotap.present.tsft                   float64\n",
            "radiotap.present.flags                  float64\n",
            "radiotap.present.channel                float64\n",
            "radiotap.present.dbm_antsignal          float64\n",
            "radiotap.present.antenna                float64\n",
            "radiotap.present.rxflags                float64\n",
            "radiotap.datarate                       float64\n",
            "wlan.fc.type                            float64\n",
            "wlan.fc.subtype                         float64\n",
            "wlan.fc.frag                            float64\n",
            "wlan.fc.retry                           float64\n",
            "wlan.fc.pwrmgt                          float64\n",
            "wlan.fc.moredata                        float64\n",
            "wlan.fc.protected                       float64\n",
            "radiotap.present.reserved_0x00000000    uint8\n",
            "wlan.fc.ds_0x00                         uint8\n",
            "wlan.fc.ds_0x01                         uint8\n",
            "wlan.fc.ds_0x02                         uint8\n",
            "wlan.fc.type_subtype_0x00               uint8\n",
            "wlan.fc.type_subtype_0x01               uint8\n",
            "wlan.fc.type_subtype_0x02               uint8\n",
            "wlan.fc.type_subtype_0x03               uint8\n",
            "wlan.fc.type_subtype_0x04               uint8\n",
            "wlan.fc.type_subtype_0x05               uint8\n",
            "wlan.fc.type_subtype_0x08               uint8\n",
            "wlan.fc.type_subtype_0x0a               uint8\n",
            "wlan.fc.type_subtype_0x0b               uint8\n",
            "wlan.fc.type_subtype_0x0c               uint8\n",
            "wlan.fc.type_subtype_0x0d               uint8\n",
            "wlan.fc.type_subtype_0x18               uint8\n",
            "wlan.fc.type_subtype_0x19               uint8\n",
            "wlan.fc.type_subtype_0x1a               uint8\n",
            "wlan.fc.type_subtype_0x1b               uint8\n",
            "wlan.fc.type_subtype_0x1c               uint8\n",
            "wlan.fc.type_subtype_0x1d               uint8\n",
            "wlan.fc.type_subtype_0x20               uint8\n",
            "wlan.fc.type_subtype_0x24               uint8\n",
            "wlan.fc.type_subtype_0x28               uint8\n",
            "wlan.fc.type_subtype_0x2c               uint8\n",
            "labels                                  object\n",
            "dtypes: float64(21), object(1), uint8(25)\n",
            "memory usage: 344.2+ MB\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "7GmfCWBXc0du",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 333
        },
        "outputId": "3727ef01-f241-42d9-c6a7-b7ce9a451192"
      },
      "cell_type": "code",
      "source": [
        "train.describe()"
      ],
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>frame.time_epoch</th>\n",
              "      <th>frame.time_delta</th>\n",
              "      <th>frame.time_delta_displayed</th>\n",
              "      <th>frame.time_relative</th>\n",
              "      <th>frame.len</th>\n",
              "      <th>frame.cap_len</th>\n",
              "      <th>radiotap.length</th>\n",
              "      <th>radiotap.present.tsft</th>\n",
              "      <th>radiotap.present.flags</th>\n",
              "      <th>radiotap.present.channel</th>\n",
              "      <th>...</th>\n",
              "      <th>wlan.fc.type_subtype_0x18</th>\n",
              "      <th>wlan.fc.type_subtype_0x19</th>\n",
              "      <th>wlan.fc.type_subtype_0x1a</th>\n",
              "      <th>wlan.fc.type_subtype_0x1b</th>\n",
              "      <th>wlan.fc.type_subtype_0x1c</th>\n",
              "      <th>wlan.fc.type_subtype_0x1d</th>\n",
              "      <th>wlan.fc.type_subtype_0x20</th>\n",
              "      <th>wlan.fc.type_subtype_0x24</th>\n",
              "      <th>wlan.fc.type_subtype_0x28</th>\n",
              "      <th>wlan.fc.type_subtype_0x2c</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>count</th>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>...</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "      <td>1.795575e+06</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>mean</th>\n",
              "      <td>2.312808e-01</td>\n",
              "      <td>5.723385e-03</td>\n",
              "      <td>5.723385e-03</td>\n",
              "      <td>5.195880e-01</td>\n",
              "      <td>3.106633e-01</td>\n",
              "      <td>3.106633e-01</td>\n",
              "      <td>9.995656e-01</td>\n",
              "      <td>9.995656e-01</td>\n",
              "      <td>9.995656e-01</td>\n",
              "      <td>9.995656e-01</td>\n",
              "      <td>...</td>\n",
              "      <td>1.280927e-05</td>\n",
              "      <td>4.344012e-05</td>\n",
              "      <td>6.638542e-04</td>\n",
              "      <td>7.100789e-04</td>\n",
              "      <td>1.999694e-02</td>\n",
              "      <td>2.321902e-01</td>\n",
              "      <td>1.302697e-01</td>\n",
              "      <td>1.033875e-02</td>\n",
              "      <td>3.683216e-01</td>\n",
              "      <td>5.524693e-04</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>std</th>\n",
              "      <td>1.072683e-01</td>\n",
              "      <td>1.821356e-02</td>\n",
              "      <td>1.821356e-02</td>\n",
              "      <td>2.409856e-01</td>\n",
              "      <td>4.345912e-01</td>\n",
              "      <td>4.345912e-01</td>\n",
              "      <td>2.083777e-02</td>\n",
              "      <td>2.083777e-02</td>\n",
              "      <td>2.083777e-02</td>\n",
              "      <td>2.083777e-02</td>\n",
              "      <td>...</td>\n",
              "      <td>3.578982e-03</td>\n",
              "      <td>6.590771e-03</td>\n",
              "      <td>2.575682e-02</td>\n",
              "      <td>2.663785e-02</td>\n",
              "      <td>1.399895e-01</td>\n",
              "      <td>4.222298e-01</td>\n",
              "      <td>3.366000e-01</td>\n",
              "      <td>1.011527e-01</td>\n",
              "      <td>4.823494e-01</td>\n",
              "      <td>2.349818e-02</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>min</th>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>...</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25%</th>\n",
              "      <td>1.271072e-01</td>\n",
              "      <td>8.993242e-04</td>\n",
              "      <td>8.993242e-04</td>\n",
              "      <td>2.855550e-01</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>...</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>50%</th>\n",
              "      <td>2.352776e-01</td>\n",
              "      <td>1.567394e-03</td>\n",
              "      <td>1.567394e-03</td>\n",
              "      <td>5.285670e-01</td>\n",
              "      <td>4.705882e-02</td>\n",
              "      <td>4.705882e-02</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>...</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>75%</th>\n",
              "      <td>3.121584e-01</td>\n",
              "      <td>3.177612e-03</td>\n",
              "      <td>3.177612e-03</td>\n",
              "      <td>7.012848e-01</td>\n",
              "      <td>9.882353e-01</td>\n",
              "      <td>9.882353e-01</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>...</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>0.000000e+00</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>max</th>\n",
              "      <td>4.451235e-01</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>...</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>8 rows × 46 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "       frame.time_epoch  frame.time_delta  frame.time_delta_displayed  \\\n",
              "count      1.795575e+06      1.795575e+06                1.795575e+06   \n",
              "mean       2.312808e-01      5.723385e-03                5.723385e-03   \n",
              "std        1.072683e-01      1.821356e-02                1.821356e-02   \n",
              "min        0.000000e+00      0.000000e+00                0.000000e+00   \n",
              "25%        1.271072e-01      8.993242e-04                8.993242e-04   \n",
              "50%        2.352776e-01      1.567394e-03                1.567394e-03   \n",
              "75%        3.121584e-01      3.177612e-03                3.177612e-03   \n",
              "max        4.451235e-01      1.000000e+00                1.000000e+00   \n",
              "\n",
              "       frame.time_relative     frame.len  frame.cap_len  radiotap.length  \\\n",
              "count         1.795575e+06  1.795575e+06   1.795575e+06     1.795575e+06   \n",
              "mean          5.195880e-01  3.106633e-01   3.106633e-01     9.995656e-01   \n",
              "std           2.409856e-01  4.345912e-01   4.345912e-01     2.083777e-02   \n",
              "min           0.000000e+00  0.000000e+00   0.000000e+00     0.000000e+00   \n",
              "25%           2.855550e-01  0.000000e+00   0.000000e+00     1.000000e+00   \n",
              "50%           5.285670e-01  4.705882e-02   4.705882e-02     1.000000e+00   \n",
              "75%           7.012848e-01  9.882353e-01   9.882353e-01     1.000000e+00   \n",
              "max           1.000000e+00  1.000000e+00   1.000000e+00     1.000000e+00   \n",
              "\n",
              "       radiotap.present.tsft  radiotap.present.flags  \\\n",
              "count           1.795575e+06            1.795575e+06   \n",
              "mean            9.995656e-01            9.995656e-01   \n",
              "std             2.083777e-02            2.083777e-02   \n",
              "min             0.000000e+00            0.000000e+00   \n",
              "25%             1.000000e+00            1.000000e+00   \n",
              "50%             1.000000e+00            1.000000e+00   \n",
              "75%             1.000000e+00            1.000000e+00   \n",
              "max             1.000000e+00            1.000000e+00   \n",
              "\n",
              "       radiotap.present.channel            ...              \\\n",
              "count              1.795575e+06            ...               \n",
              "mean               9.995656e-01            ...               \n",
              "std                2.083777e-02            ...               \n",
              "min                0.000000e+00            ...               \n",
              "25%                1.000000e+00            ...               \n",
              "50%                1.000000e+00            ...               \n",
              "75%                1.000000e+00            ...               \n",
              "max                1.000000e+00            ...               \n",
              "\n",
              "       wlan.fc.type_subtype_0x18  wlan.fc.type_subtype_0x19  \\\n",
              "count               1.795575e+06               1.795575e+06   \n",
              "mean                1.280927e-05               4.344012e-05   \n",
              "std                 3.578982e-03               6.590771e-03   \n",
              "min                 0.000000e+00               0.000000e+00   \n",
              "25%                 0.000000e+00               0.000000e+00   \n",
              "50%                 0.000000e+00               0.000000e+00   \n",
              "75%                 0.000000e+00               0.000000e+00   \n",
              "max                 1.000000e+00               1.000000e+00   \n",
              "\n",
              "       wlan.fc.type_subtype_0x1a  wlan.fc.type_subtype_0x1b  \\\n",
              "count               1.795575e+06               1.795575e+06   \n",
              "mean                6.638542e-04               7.100789e-04   \n",
              "std                 2.575682e-02               2.663785e-02   \n",
              "min                 0.000000e+00               0.000000e+00   \n",
              "25%                 0.000000e+00               0.000000e+00   \n",
              "50%                 0.000000e+00               0.000000e+00   \n",
              "75%                 0.000000e+00               0.000000e+00   \n",
              "max                 1.000000e+00               1.000000e+00   \n",
              "\n",
              "       wlan.fc.type_subtype_0x1c  wlan.fc.type_subtype_0x1d  \\\n",
              "count               1.795575e+06               1.795575e+06   \n",
              "mean                1.999694e-02               2.321902e-01   \n",
              "std                 1.399895e-01               4.222298e-01   \n",
              "min                 0.000000e+00               0.000000e+00   \n",
              "25%                 0.000000e+00               0.000000e+00   \n",
              "50%                 0.000000e+00               0.000000e+00   \n",
              "75%                 0.000000e+00               0.000000e+00   \n",
              "max                 1.000000e+00               1.000000e+00   \n",
              "\n",
              "       wlan.fc.type_subtype_0x20  wlan.fc.type_subtype_0x24  \\\n",
              "count               1.795575e+06               1.795575e+06   \n",
              "mean                1.302697e-01               1.033875e-02   \n",
              "std                 3.366000e-01               1.011527e-01   \n",
              "min                 0.000000e+00               0.000000e+00   \n",
              "25%                 0.000000e+00               0.000000e+00   \n",
              "50%                 0.000000e+00               0.000000e+00   \n",
              "75%                 0.000000e+00               0.000000e+00   \n",
              "max                 1.000000e+00               1.000000e+00   \n",
              "\n",
              "       wlan.fc.type_subtype_0x28  wlan.fc.type_subtype_0x2c  \n",
              "count               1.795575e+06               1.795575e+06  \n",
              "mean                3.683216e-01               5.524693e-04  \n",
              "std                 4.823494e-01               2.349818e-02  \n",
              "min                 0.000000e+00               0.000000e+00  \n",
              "25%                 0.000000e+00               0.000000e+00  \n",
              "50%                 0.000000e+00               0.000000e+00  \n",
              "75%                 1.000000e+00               0.000000e+00  \n",
              "max                 1.000000e+00               1.000000e+00  \n",
              "\n",
              "[8 rows x 46 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 14
        }
      ]
    },
    {
      "metadata": {
        "id": "WXzr-11HTlU6",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 890
        },
        "outputId": "1f88bdcc-469a-4465-8b14-9135a1508dc8"
      },
      "cell_type": "code",
      "source": [
        "test.info()"
      ],
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "<class 'pandas.core.frame.DataFrame'>\n",
            "RangeIndex: 575643 entries, 1795575 to 2371217\n",
            "Data columns (total 47 columns):\n",
            "frame.time_epoch                        575643 non-null float64\n",
            "frame.time_delta                        575643 non-null float64\n",
            "frame.time_delta_displayed              575643 non-null float64\n",
            "frame.time_relative                     575643 non-null float64\n",
            "frame.len                               575643 non-null float64\n",
            "frame.cap_len                           575643 non-null float64\n",
            "radiotap.length                         575643 non-null float64\n",
            "radiotap.present.tsft                   575643 non-null float64\n",
            "radiotap.present.flags                  575643 non-null float64\n",
            "radiotap.present.channel                575643 non-null float64\n",
            "radiotap.present.dbm_antsignal          575643 non-null float64\n",
            "radiotap.present.antenna                575643 non-null float64\n",
            "radiotap.present.rxflags                575643 non-null float64\n",
            "radiotap.datarate                       575643 non-null float64\n",
            "wlan.fc.type                            575643 non-null float64\n",
            "wlan.fc.subtype                         575643 non-null float64\n",
            "wlan.fc.frag                            575643 non-null float64\n",
            "wlan.fc.retry                           575643 non-null float64\n",
            "wlan.fc.pwrmgt                          575643 non-null float64\n",
            "wlan.fc.moredata                        575643 non-null float64\n",
            "wlan.fc.protected                       575643 non-null float64\n",
            "radiotap.present.reserved_0x00000000    575643 non-null uint8\n",
            "wlan.fc.ds_0x00                         575643 non-null uint8\n",
            "wlan.fc.ds_0x01                         575643 non-null uint8\n",
            "wlan.fc.ds_0x02                         575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x00               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x01               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x02               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x03               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x04               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x05               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x08               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x0a               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x0b               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x0c               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x0d               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x18               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x19               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x1a               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x1b               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x1c               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x1d               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x20               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x24               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x28               575643 non-null uint8\n",
            "wlan.fc.type_subtype_0x2c               575643 non-null uint8\n",
            "labels                                  575643 non-null object\n",
            "dtypes: float64(21), object(1), uint8(25)\n",
            "memory usage: 110.3+ MB\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "2kk6Nys7QHHm",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "num_cols = list(train._get_numeric_data().columns)\n",
        "cat_cols = list(set(train.columns)-set(num_cols))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "5k4zfKxRQI9G",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "40dc6e6e-b89f-4c74-c16d-0e893a078220"
      },
      "cell_type": "code",
      "source": [
        "len(num_cols)"
      ],
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "46"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 17
        }
      ]
    },
    {
      "metadata": {
        "id": "VnVwRFWMdCEV",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "d8c4f10c-5016-43cf-9ca9-bf43996e54bd"
      },
      "cell_type": "code",
      "source": [
        "train.shape"
      ],
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(1795575, 47)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 18
        }
      ]
    },
    {
      "metadata": {
        "id": "YKA8QTFrb1ZR",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "class data_cls:\n",
        "    def __init__(self,train_test):\n",
        "        \n",
        "       \n",
        "        self.index = 0\n",
        "        if(train_test==\"train\"):\n",
        "          self.train_path = train_path\n",
        "        else:\n",
        "          self.train_path = test_path\n",
        "       \n",
        "   \n",
        "        self.df = pd.read_csv(self.train_path,sep=',')\n",
        "    \n",
        "\n",
        "         # One hot encoding for labels\n",
        "        self.df = pd.concat([self.df.drop('labels', axis=1),\n",
        "                pd.get_dummies(self.df['labels'])], axis=1)\n",
        "        \n",
        "\n",
        "        self.attack_types = ['normal', 'flooding', 'injection', 'impersonation']\n",
        "        self.all_attack_types = ['normal', 'flooding', 'injection', 'impersonation']\n",
        "        self.attack_names = ['normal', 'flooding', 'injection', 'impersonation']\n",
        "        \n",
        "\n",
        "        self.attack_map =   { 'normal': 'normal','flooding': 'flooding', 'injection':'injection', 'impersonation':'impersonation'}\n",
        "        \n",
        "        self.all_attack_names = list(self.attack_map.keys())\n",
        "\n",
        "        self.df = self.df.sample(frac=1)\n",
        "\n",
        "\n",
        "    def get_shape(self):\n",
        "              \n",
        "        self.data_shape = self.df.shape\n",
        "        # stata + labels\n",
        "        return self.data_shape\n",
        "    \n",
        "    ''' Get n-rows from loaded data \n",
        "        The dataset must be loaded in RAM\n",
        "    '''\n",
        "    def get_batch(self,batch_size=100):\n",
        "                \n",
        "        # Read the df rows\n",
        "        indexes = list(range(self.index,self.index+batch_size))    \n",
        "        if max(indexes)>self.data_shape[0]-1:\n",
        "            dif = max(indexes)-self.data_shape[0]\n",
        "            indexes[len(indexes)-dif-1:len(indexes)] = list(range(dif+1))\n",
        "            self.index=batch_size-dif\n",
        "            batch = self.df.iloc[indexes]\n",
        "        else: \n",
        "            batch = self.df.iloc[indexes]\n",
        "            self.index += batch_size    \n",
        "            \n",
        "        labels = batch[self.attack_names]\n",
        "        \n",
        "        batch = batch.drop(self.all_attack_names,axis=1)\n",
        "            \n",
        "        return batch,labels\n",
        "    \n",
        "    def get_full(self):\n",
        "              \n",
        "        labels = self.df[self.attack_names]\n",
        "        \n",
        "        batch = self.df.drop(self.all_attack_names,axis=1)\n",
        "        \n",
        "\n",
        "        return batch,labels\n",
        "  "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "5DbMxSATehU-",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# Huber loss function        \n",
        "def huber_loss(y_true, y_pred, clip_value=1):\n",
        "    # Huber loss, see https://en.wikipedia.org/wiki/Huber_loss and\n",
        "    # https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b\n",
        "    # for details.\n",
        "    assert clip_value > 0.\n",
        "\n",
        "    x = y_true - y_pred\n",
        "    if np.isinf(clip_value):\n",
        "        # Spacial case for infinity since Tensorflow does have problems\n",
        "        # if we compare `K.abs(x) < np.inf`.\n",
        "        return .5 * K.square(x)\n",
        "\n",
        "    condition = K.abs(x) < clip_value\n",
        "    squared_loss = .5 * K.square(x)\n",
        "    linear_loss = clip_value * (K.abs(x) - .5 * clip_value)\n",
        "    if K.backend() == 'tensorflow':\n",
        "        import tensorflow as tf\n",
        "        if hasattr(tf, 'select'):\n",
        "            return tf.select(condition, squared_loss, linear_loss)  # condition, true, false\n",
        "        else:\n",
        "            return tf.where(condition, squared_loss, linear_loss)  # condition, true, false\n",
        "    elif K.backend() == 'theano':\n",
        "        from theano import tensor as T\n",
        "        return T.switch(condition, squared_loss, linear_loss)\n",
        "    else:\n",
        "        raise RuntimeError('Unknown backend \"{}\".'.format(K.backend()))\n",
        "\n",
        "# Needed for keras huber_loss locate\n",
        "import keras.losses\n",
        "keras.losses.huber_loss = huber_loss\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "7XkKb6WaesLN",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "class QNetwork():\n",
        "    \"\"\"\n",
        "    Q-Network Estimator\n",
        "    Represents the global model for the table\n",
        "    \"\"\"\n",
        "\n",
        "    def __init__(self,obs_size,num_actions,hidden_size = 100,\n",
        "                 hidden_layers = 1,learning_rate=.2):\n",
        "        \"\"\"\n",
        "        Initialize the network with the provided shape\n",
        "        \"\"\"\n",
        "        self.obs_size = obs_size\n",
        "        self.num_actions = num_actions\n",
        "        \n",
        "        # Network arquitecture\n",
        "        self.model = Sequential()\n",
        "        # Add imput layer\n",
        "        self.model.add(Dense(hidden_size, input_shape=(obs_size,),\n",
        "                             activation='relu'))\n",
        "        # Add hidden layers\n",
        "        for layers in range(hidden_layers):\n",
        "            self.model.add(Dense(hidden_size, activation='relu'))\n",
        "        # Add output layer    \n",
        "        self.model.add(Dense(num_actions))\n",
        "        \n",
        "        #optimizer = optimizers.SGD(learning_rate)\n",
        "        # optimizer = optimizers.Adam(alpha=learning_rate)\n",
        "        optimizer = optimizers.Adam(0.00025)\n",
        "        # optimizer = optimizers.RMSpropGraves(learning_rate, 0.95, self.momentum, 1e-2)\n",
        "        \n",
        "        # Compilation of the model with optimizer and loss\n",
        "        self.model.compile(loss=huber_loss,optimizer=optimizer)\n",
        "\n",
        "    def predict(self,state,batch_size=1):\n",
        "        \"\"\"\n",
        "        Predicts action values.\n",
        "        \"\"\"\n",
        "        return self.model.predict(state,batch_size=batch_size)\n",
        "\n",
        "    def update(self, states, q):\n",
        "        \"\"\"\n",
        "        Updates the estimator with the targets.\n",
        "\n",
        "        Args:\n",
        "          states: Target states\n",
        "          q: Estimated values\n",
        "\n",
        "        Returns:\n",
        "          The calculated loss on the batch.\n",
        "        \"\"\"\n",
        "        loss = self.model.train_on_batch(states, q)\n",
        "        return loss\n",
        "    \n",
        "    def copy_model(model):\n",
        "        \"\"\"Returns a copy of a keras model.\"\"\"\n",
        "        model.save('tmp_model')\n",
        "        return keras.models.load_model('tmp_model')\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "-u8-r77Jexf2",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "#Policy interface\n",
        "class Policy:\n",
        "    def __init__(self, num_actions, estimator):\n",
        "        self.num_actions = num_actions\n",
        "        self.estimator = estimator\n",
        "    \n",
        "class Epsilon_greedy(Policy):\n",
        "    def __init__(self,estimator ,num_actions ,epsilon,min_epsilon,decay_rate, epoch_length):\n",
        "        Policy.__init__(self, num_actions, estimator)\n",
        "        self.name = \"Epsilon Greedy\"\n",
        "        \n",
        "        if (epsilon is None or epsilon < 0 or epsilon > 1):\n",
        "            print(\"EpsilonGreedy: Invalid value of epsilon\", flush = True)\n",
        "            sys.exit(0)\n",
        "        self.epsilon = epsilon\n",
        "        self.min_epsilon = min_epsilon\n",
        "        self.actions = list(range(num_actions))\n",
        "        self.step_counter = 0\n",
        "        self.epoch_length = epoch_length\n",
        "        self.decay_rate = decay_rate\n",
        "        \n",
        "        #if epsilon is up 0.1, it will be decayed over time\n",
        "        if self.epsilon > 0.01:\n",
        "            self.epsilon_decay = True\n",
        "        else:\n",
        "            self.epsilon_decay = False\n",
        "    \n",
        "    def get_actions(self,states):\n",
        "        # get next action\n",
        "        if np.random.rand() <= self.epsilon:\n",
        "            actions = np.random.randint(0, self.num_actions,states.shape[0])\n",
        "        else:\n",
        "            self.Q = self.estimator.predict(states,states.shape[0])\n",
        "            actions = []\n",
        "            for row in range(self.Q.shape[0]):\n",
        "                best_actions = np.argwhere(self.Q[row] == np.amax(self.Q[row]))\n",
        "                actions.append(best_actions[np.random.choice(len(best_actions))].item())\n",
        "            \n",
        "        self.step_counter += 1 \n",
        "        # decay epsilon after each epoch\n",
        "        if self.epsilon_decay:\n",
        "            if self.step_counter % self.epoch_length == 0:\n",
        "                self.epsilon = max(self.min_epsilon, self.epsilon * self.decay_rate**self.step_counter)\n",
        "            \n",
        "        return actions"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "2gBTfI8ke08v",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "class ReplayMemory(object):\n",
        "    \"\"\"Implements basic replay memory\"\"\"\n",
        "\n",
        "    def __init__(self, observation_size, max_size):\n",
        "        self.observation_size = observation_size\n",
        "        self.num_observed = 0\n",
        "        self.max_size = max_size\n",
        "        self.samples = {\n",
        "                 'obs'      : np.zeros(self.max_size * 1 * self.observation_size,\n",
        "                                       dtype=np.float32).reshape(self.max_size,self.observation_size),\n",
        "                 'action'   : np.zeros(self.max_size * 1, dtype=np.int16).reshape(self.max_size, 1),\n",
        "                 'reward'   : np.zeros(self.max_size * 1).reshape(self.max_size, 1),\n",
        "                 'terminal' : np.zeros(self.max_size * 1, dtype=np.int16).reshape(self.max_size, 1),\n",
        "               }\n",
        "\n",
        "    def observe(self, state, action, reward, done):\n",
        "        index = self.num_observed % self.max_size\n",
        "        self.samples['obs'][index, :] = state\n",
        "        self.samples['action'][index, :] = action\n",
        "        self.samples['reward'][index, :] = reward\n",
        "        self.samples['terminal'][index, :] = done\n",
        "\n",
        "        self.num_observed += 1\n",
        "\n",
        "    def sample_minibatch(self, minibatch_size):\n",
        "        max_index = min(self.num_observed, self.max_size) - 1\n",
        "        sampled_indices = np.random.randint(max_index, size=minibatch_size)\n",
        "\n",
        "        s      = np.asarray(self.samples['obs'][sampled_indices, :], dtype=np.float32)\n",
        "        s_next = np.asarray(self.samples['obs'][sampled_indices+1, :], dtype=np.float32)\n",
        "\n",
        "        a      = self.samples['action'][sampled_indices].reshape(minibatch_size)\n",
        "        r      = self.samples['reward'][sampled_indices].reshape((minibatch_size, 1))\n",
        "        done   = self.samples['terminal'][sampled_indices].reshape((minibatch_size, 1))\n",
        "\n",
        "        return (s, a, r, s_next, done)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "qXeEzOaIe32m",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "'''\n",
        "Reinforcement learning Agent definition\n",
        "'''\n",
        "\n",
        "class Agent(object):  \n",
        "        \n",
        "    def __init__(self, actions,obs_size, policy=\"EpsilonGreedy\", **kwargs):\n",
        "        self.actions = actions\n",
        "        self.num_actions = len(actions)\n",
        "        self.obs_size = obs_size\n",
        "        \n",
        "        self.epsilon = kwargs.get('epsilon', 1)\n",
        "        self.min_epsilon = kwargs.get('min_epsilon', .1)\n",
        "        self.gamma = kwargs.get('gamma', .001)\n",
        "        self.minibatch_size = kwargs.get('minibatch_size', 2)\n",
        "        self.epoch_length = kwargs.get('epoch_length', 100)\n",
        "        self.decay_rate = kwargs.get('decay_rate',0.99)\n",
        "        self.ExpRep = kwargs.get('ExpRep',True)\n",
        "        if self.ExpRep:\n",
        "            self.memory = ReplayMemory(self.obs_size, kwargs.get('mem_size', 10))\n",
        "        \n",
        "        self.ddqn_time = 100\n",
        "        self.ddqn_update = self.ddqn_time\n",
        "\n",
        "        \n",
        "        self.model_network = QNetwork(self.obs_size, self.num_actions,\n",
        "                                      kwargs.get('hidden_size', 100),\n",
        "                                      kwargs.get('hidden_layers',1),\n",
        "                                      kwargs.get('learning_rate',.2))\n",
        "        self.target_model_network = QNetwork(self.obs_size, self.num_actions,\n",
        "                                      kwargs.get('hidden_size', 100),\n",
        "                                      kwargs.get('hidden_layers',1),\n",
        "                                      kwargs.get('learning_rate',.2))\n",
        "        self.target_model_network.model = QNetwork.copy_model(self.model_network.model)\n",
        "        \n",
        "        if policy == \"EpsilonGreedy\":\n",
        "            self.policy = Epsilon_greedy(self.model_network,len(actions),\n",
        "                                         self.epsilon,self.min_epsilon,\n",
        "                                         self.decay_rate,self.epoch_length)\n",
        "        \n",
        "        \n",
        "    def learn(self, states, actions,next_states, rewards, done):\n",
        "        if self.ExpRep:\n",
        "            self.memory.observe(states, actions, rewards, done)\n",
        "        else:\n",
        "            self.states = states\n",
        "            self.actions = actions\n",
        "            self.next_states = next_states\n",
        "            self.rewards = rewards\n",
        "            self.done = done        \n",
        "    def update_model(self):\n",
        "        if self.ExpRep:\n",
        "            (states, actions, rewards, next_states, done) = self.memory.sample_minibatch(self.minibatch_size)\n",
        "        else:\n",
        "            states = self.states\n",
        "            rewards = self.rewards\n",
        "            next_states = self.next_states\n",
        "            actions = self.actions\n",
        "            done = self.done\n",
        "        \n",
        "        next_actions = []\n",
        "        # Compute Q targets\n",
        "#        Q_prime = self.model_network.predict(next_states,self.minibatch_size)\n",
        "        Q_prime = self.target_model_network.predict(next_states,self.minibatch_size)\n",
        "        # TODO: fix performance in this loop\n",
        "        for row in range(Q_prime.shape[0]):\n",
        "            best_next_actions = np.argwhere(Q_prime[row] == np.amax(Q_prime[row]))\n",
        "            next_actions.append(best_next_actions[np.random.choice(len(best_next_actions))].item())\n",
        "        sx = np.arange(len(next_actions))\n",
        "        # Compute Q(s,a)\n",
        "        Q = self.model_network.predict(states,self.minibatch_size)\n",
        "        # Q-learning update\n",
        "        # target = reward + gamma * max_a'{Q(next_state,next_action))}\n",
        "        targets = rewards.reshape(Q[sx,actions].shape) + \\\n",
        "                  self.gamma * Q[sx,next_actions] * \\\n",
        "                  (1-done.reshape(Q[sx,actions].shape))   \n",
        "        Q[sx,actions] = targets  \n",
        "        \n",
        "        loss = self.model_network.model.train_on_batch(states,Q)#inputs,targets        \n",
        "        \n",
        "        # timer to ddqn update\n",
        "        self.ddqn_update -= 1\n",
        "        if self.ddqn_update == 0:\n",
        "            self.ddqn_update = self.ddqn_time\n",
        "#            self.target_model_network.model = QNetwork.copy_model(self.model_network.model)\n",
        "            self.target_model_network.model.set_weights(self.model_network.model.get_weights()) \n",
        "        \n",
        "        return loss    \n",
        "\n",
        "    def act(self, state,policy):\n",
        "        raise NotImplementedError"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "h-K4eEuDe-QE",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "yzoWE1L8fCKP",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "class DefenderAgent(Agent):      \n",
        "    def __init__(self, actions, obs_size, policy=\"EpsilonGreedy\", **kwargs):\n",
        "        super().__init__(actions,obs_size, policy=\"EpsilonGreedy\", **kwargs)\n",
        "        \n",
        "    def act(self,states):\n",
        "        # Get actions under the policy\n",
        "        actions = self.policy.get_actions(states)\n",
        "        return actions\n",
        "    \n",
        "class AttackAgent(Agent):      \n",
        "    def __init__(self, actions, obs_size, policy=\"EpsilonGreedy\", **kwargs):\n",
        "        super().__init__(actions,obs_size, policy=\"EpsilonGreedy\", **kwargs)\n",
        "        \n",
        "    def act(self,states):\n",
        "        # Get actions under the policy\n",
        "        actions = self.policy.get_actions(states)\n",
        "        return actions"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "ojLCmmE3fCpw",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "'''\n",
        "Reinforcement learning Enviroment Definition\n",
        "'''\n",
        "class RLenv(data_cls):\n",
        "    def __init__(self,train_test,**kwargs):\n",
        "        data_cls.__init__(self,train_test)\n",
        "        self.data_shape = data_cls.get_shape(self)\n",
        "        self.batch_size = kwargs.get('batch_size',1) # experience replay -> batch = 1\n",
        "        self.iterations_episode = kwargs.get('iterations_episode',10)\n",
        "        \n",
        "\n",
        "    '''\n",
        "    _update_state: function to update the current state\n",
        "    Returns:\n",
        "        None\n",
        "    Modifies the self parameters involved in the state:\n",
        "        self.state and self.labels\n",
        "    Also modifies the true labels to get learning knowledge\n",
        "    '''\n",
        "    def _update_state(self):        \n",
        "        self.states,self.labels = data_cls.get_batch(self)\n",
        "        \n",
        "        # Update statistics\n",
        "        self.true_labels += np.sum(self.labels).values\n",
        "\n",
        "    '''\n",
        "    Returns:\n",
        "        + Observation of the enviroment\n",
        "    '''\n",
        "    def reset(self):\n",
        "        # Statistics\n",
        "        self.def_true_labels = np.zeros(len(self.attack_types),dtype=int)\n",
        "        self.def_estimated_labels = np.zeros(len(self.attack_types),dtype=int)\n",
        "        self.att_true_labels = np.zeros(len(self.attack_names),dtype=int)\n",
        "        \n",
        "        self.state_numb = 0\n",
        "        \n",
        "        self.states,self.labels = data_cls.get_batch(self,self.batch_size)\n",
        "        \n",
        "        self.total_reward = 0\n",
        "        self.steps_in_episode = 0\n",
        "        return self.states.values \n",
        "   \n",
        "    '''\n",
        "    Returns:\n",
        "        State: Next state for the game\n",
        "        Reward: Actual reward\n",
        "        done: If the game ends (no end in this case)\n",
        "    \n",
        "    In the adversarial enviroment, it's only needed to return the actual reward\n",
        "    '''    \n",
        "    def act(self,defender_actions,attack_actions):\n",
        "        # Clear previous rewards        \n",
        "        self.att_reward = np.zeros(len(attack_actions))       \n",
        "        self.def_reward = np.zeros(len(defender_actions))\n",
        "        \n",
        "        \n",
        "        attack = [self.attack_types.index(self.attack_map[self.attack_names[att]]) for att in attack_actions]\n",
        "        \n",
        "        self.def_reward = (np.asarray(defender_actions)==np.asarray(attack))*1\n",
        "        self.att_reward = (np.asarray(defender_actions)!=np.asarray(attack))*1\n",
        "\n",
        "         \n",
        "       \n",
        "        self.def_estimated_labels += np.bincount(defender_actions,minlength=len(self.attack_types))\n",
        "        # TODO\n",
        "        # list comprehension\n",
        "        \n",
        "        for act in attack_actions:\n",
        "            self.def_true_labels[self.attack_types.index(self.attack_map[self.attack_names[act]])] += 1\n",
        "        \n",
        "\n",
        "        # Get new state and new true values \n",
        "        attack_actions = attacker_agent.act(self.states)\n",
        "        self.states = env.get_states(attack_actions)\n",
        "        \n",
        "        # Done allways false in this continuous task       \n",
        "        self.done = np.zeros(len(attack_actions),dtype=bool)\n",
        "            \n",
        "        return self.states, self.def_reward,self.att_reward, attack_actions, self.done\n",
        "    \n",
        "    '''\n",
        "    Provide the actual states for the selected attacker actions\n",
        "    Parameters:\n",
        "        self:\n",
        "        attacker_actions: optimum attacks selected by the attacker\n",
        "            it can be one of attack_names list and select random of this\n",
        "    Returns:\n",
        "        State: Actual state for the selected attacks\n",
        "    '''\n",
        "    def get_states(self,attacker_actions):\n",
        "        first = True\n",
        "        for attack in attacker_actions:\n",
        "            if first:\n",
        "                minibatch = (self.df[self.df[self.attack_names[attack]]==1].sample(1))\n",
        "                first = False\n",
        "            else:\n",
        "                minibatch=minibatch.append(self.df[self.df[self.attack_names[attack]]==1].sample(1))\n",
        "        \n",
        "        self.labels = minibatch[self.attack_names]\n",
        "        minibatch.drop(self.all_attack_names,axis=1,inplace=True)\n",
        "        self.states = minibatch\n",
        "        \n",
        "        return self.states\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "M0eU7ZSGfNEB",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 8568
        },
        "outputId": "6eef8ba4-af39-484c-f57e-33de8882e00f"
      },
      "cell_type": "code",
      "source": [
        "if __name__ == \"__main__\":\n",
        "  \n",
        "   \n",
        "    \n",
        "    # Train batch\n",
        "    batch_size = 1\n",
        "    # batch of memory ExpRep\n",
        "    minibatch_size = 10\n",
        "    ExpRep = True\n",
        "    \n",
        "    iterations_episode = 100\n",
        "  \n",
        "    # Initialization of the enviroment\n",
        "    env = RLenv(\"train\",batch_size=batch_size,\n",
        "                iterations_episode=iterations_episode)    \n",
        "    # obs_size = size of the state\n",
        "    obs_size = env.data_shape[1]-len(env.all_attack_names)\n",
        "    \n",
        "    #num_episodes = int(env.data_shape[0]/(iterations_episode)/10)\n",
        "    num_episodes = 100\n",
        "    \n",
        "    '''\n",
        "    Definition for the defensor agent.\n",
        "    '''\n",
        "    defender_valid_actions = list(range(len(env.attack_types))) # only detect type of attack\n",
        "    defender_num_actions = len(defender_valid_actions)    \n",
        "    \n",
        "\t\n",
        "    def_epsilon = 1 # exploration\n",
        "    min_epsilon = 0.01 # min value for exploration\n",
        "    def_gamma = 0.001\n",
        "    def_decay_rate = 0.999\n",
        "    \n",
        "    def_hidden_size = 100\n",
        "    def_hidden_layers = 2\n",
        "    \n",
        "    def_learning_rate = .01\n",
        "    \n",
        "    defender_agent = DefenderAgent(defender_valid_actions,obs_size,\"EpsilonGreedy\",\n",
        "                          epoch_length = iterations_episode,\n",
        "                          epsilon = def_epsilon,\n",
        "                          min_epsilon = min_epsilon,\n",
        "                          decay_rate = def_decay_rate,\n",
        "                          gamma = def_gamma,\n",
        "                          hidden_size=def_hidden_size,\n",
        "                          hidden_layers=def_hidden_layers,\n",
        "                          minibatch_size = minibatch_size,\n",
        "                          mem_size = 1000,\n",
        "                          learning_rate=def_learning_rate,\n",
        "                          ExpRep=ExpRep)\n",
        "    #Pretrained defender\n",
        "    #defender_agent.model_network.model.load_weights(\"models/type_model.h5\")    \n",
        "    \n",
        "    '''\n",
        "    Definition for the attacker agent.\n",
        "    In this case the exploration is better to be greater\n",
        "    The correlation sould be greater too so gamma bigger\n",
        "    '''\n",
        "    attack_valid_actions = list(range(len(env.attack_names)))\n",
        "    attack_num_actions = len(attack_valid_actions)\n",
        "\t\n",
        "    att_epsilon = 1\n",
        "    min_epsilon = 0.99 # min value for exploration\n",
        "\n",
        "    att_gamma = 0.001\n",
        "    att_decay_rate = 0.99\n",
        "    \n",
        "    att_hidden_layers = 1\n",
        "    att_hidden_size = 100\n",
        "    \n",
        "    att_learning_rate = 0.2\n",
        "    \n",
        "    attacker_agent = AttackAgent(attack_valid_actions,obs_size,\"EpsilonGreedy\",\n",
        "                          epoch_length = iterations_episode,\n",
        "                          epsilon = att_epsilon,\n",
        "                          min_epsilon = min_epsilon,\n",
        "                          decay_rate = att_decay_rate,\n",
        "                          gamma = att_gamma,\n",
        "                          hidden_size=att_hidden_size,\n",
        "                          hidden_layers=att_hidden_layers,\n",
        "                          minibatch_size = minibatch_size,\n",
        "                          mem_size = 1000,\n",
        "                          learning_rate=att_learning_rate,\n",
        "                          ExpRep=ExpRep)\n",
        "    \n",
        "        \n",
        "    \n",
        "    # Statistics\n",
        "    att_reward_chain = []\n",
        "    def_reward_chain = []\n",
        "    att_loss_chain = []\n",
        "    def_loss_chain = []\n",
        "    def_total_reward_chain = []\n",
        "    att_total_reward_chain = []\n",
        "    \n",
        "\t# Print parameters\n",
        "    print(\"-------------------------------------------------------------------------------\")\n",
        "    print(\"Total epoch: {} | Iterations in epoch: {}\"\n",
        "          \"| Minibatch from mem size: {} | Total Samples: {}|\".format(num_episodes,\n",
        "                         iterations_episode,minibatch_size,\n",
        "                         num_episodes*iterations_episode))\n",
        "    print(\"-------------------------------------------------------------------------------\")\n",
        "    print(\"Dataset shape: {}\".format(env.data_shape))\n",
        "    print(\"-------------------------------------------------------------------------------\")\n",
        "    print(\"Attacker parameters: Num_actions={} | gamma={} |\" \n",
        "          \" epsilon={} | ANN hidden size={} | \"\n",
        "          \"ANN hidden layers={}|\".format(attack_num_actions,\n",
        "                             att_gamma,att_epsilon, att_hidden_size,\n",
        "                             att_hidden_layers))\n",
        "    print(\"-------------------------------------------------------------------------------\")\n",
        "    print(\"Defense parameters: Num_actions={} | gamma={} | \"\n",
        "          \"epsilon={} | ANN hidden size={} |\"\n",
        "          \" ANN hidden layers={}|\".format(defender_num_actions,\n",
        "                              def_gamma,def_epsilon,def_hidden_size,\n",
        "                              def_hidden_layers))\n",
        "    print(\"-------------------------------------------------------------------------------\")\n",
        "\n",
        "    # Main loop\n",
        "    attacks_by_epoch = []\n",
        "    attack_labels_list = []\n",
        "    for epoch in range(num_episodes):\n",
        "        start_time = time.time()\n",
        "        att_loss = 0.\n",
        "        def_loss = 0.\n",
        "        def_total_reward_by_episode = 0\n",
        "        att_total_reward_by_episode = 0\n",
        "        # Reset enviromet, actualize the data batch with random state/attacks\n",
        "        states = env.reset()\n",
        "        \n",
        "        # Get actions for actual states following the policy\n",
        "        attack_actions = attacker_agent.act(states)\n",
        "        states = env.get_states(attack_actions)    \n",
        "        \n",
        "        done = False\n",
        "       \n",
        "        attacks_list = []\n",
        "        # Iteration in one episode\n",
        "        for i_iteration in range(iterations_episode):\n",
        "            \n",
        "            attacks_list.append(attack_actions[0])\n",
        "            # apply actions, get rewards and new state\n",
        "            act_time = time.time()  \n",
        "            defender_actions = defender_agent.act(states)\n",
        "            #Enviroment actuation for this actions\n",
        "            next_states,def_reward, att_reward,next_attack_actions, done = env.act(defender_actions,attack_actions)\n",
        "            # If the epoch*batch_size*iterations_episode is largest than the df\n",
        "\n",
        "            \n",
        "            attacker_agent.learn(states,attack_actions,next_states,att_reward,done)\n",
        "            defender_agent.learn(states,defender_actions,next_states,def_reward,done)\n",
        "            \n",
        "            act_end_time = time.time()\n",
        "            \n",
        "            # Train network, update loss after at least minibatch_learns\n",
        "            if ExpRep and epoch*iterations_episode + i_iteration >= minibatch_size:\n",
        "                def_loss += defender_agent.update_model()\n",
        "                att_loss += attacker_agent.update_model()\n",
        "            elif not ExpRep:\n",
        "                def_loss += defender_agent.update_model()\n",
        "                att_loss += attacker_agent.update_model()\n",
        "                \n",
        "\n",
        "            update_end_time = time.time()\n",
        "\n",
        "            # Update the state\n",
        "            states = next_states\n",
        "            attack_actions = next_attack_actions\n",
        "            \n",
        "            \n",
        "            # Update statistics\n",
        "            def_total_reward_by_episode += np.sum(def_reward,dtype=np.int32)\n",
        "            att_total_reward_by_episode += np.sum(att_reward,dtype=np.int32)\n",
        "        \n",
        "        attacks_by_epoch.append(attacks_list)\n",
        "        # Update user view\n",
        "        def_reward_chain.append(def_total_reward_by_episode) \n",
        "        att_reward_chain.append(att_total_reward_by_episode) \n",
        "        def_loss_chain.append(def_loss)\n",
        "        att_loss_chain.append(att_loss) \n",
        "\n",
        "        \n",
        "        end_time = time.time()\n",
        "        print(\"\\r\\n|Epoch {:03d}/{:03d}| time: {:2.2f}|\\r\\n\"\n",
        "                \"|Def Loss {:4.4f} | Def Reward in ep {:03d}|\\r\\n\"\n",
        "                \"|Att Loss {:4.4f} | Att Reward in ep {:03d}|\"\n",
        "                .format(epoch, num_episodes,(end_time-start_time), \n",
        "                def_loss, def_total_reward_by_episode,\n",
        "                att_loss, att_total_reward_by_episode))\n",
        "        \n",
        "        \n",
        "        print(\"|Def Estimated: {}| Att Labels: {}\".format(env.def_estimated_labels,\n",
        "              env.def_true_labels))\n",
        "        attack_labels_list.append(env.def_true_labels)"
      ],
      "execution_count": 87,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "-------------------------------------------------------------------------------\n",
            "Total epoch: 100 | Iterations in epoch: 100| Minibatch from mem size: 10 | Total Samples: 10000|\n",
            "-------------------------------------------------------------------------------\n",
            "Dataset shape: (1795575, 50)\n",
            "-------------------------------------------------------------------------------\n",
            "Attacker parameters: Num_actions=4 | gamma=0.001 | epsilon=1 | ANN hidden size=100 | ANN hidden layers=1|\n",
            "-------------------------------------------------------------------------------\n",
            "Defense parameters: Num_actions=4 | gamma=0.001 | epsilon=1 | ANN hidden size=100 | ANN hidden layers=2|\n",
            "-------------------------------------------------------------------------------\n",
            "\n",
            "|Epoch 000/100| time: 15.46|\n",
            "|Def Loss 1.6468 | Def Reward in ep 022|\n",
            "|Att Loss 2.5482 | Att Reward in ep 078|\n",
            "|Def Estimated: [28 28 20 24]| Att Labels: [26 20 26 28]\n",
            "\n",
            "|Epoch 001/100| time: 13.09|\n",
            "|Def Loss 0.7339 | Def Reward in ep 034|\n",
            "|Att Loss 2.4797 | Att Reward in ep 066|\n",
            "|Def Estimated: [23 27 27 23]| Att Labels: [23 30 22 25]\n",
            "\n",
            "|Epoch 002/100| time: 14.70|\n",
            "|Def Loss 0.4155 | Def Reward in ep 039|\n",
            "|Att Loss 2.5638 | Att Reward in ep 061|\n",
            "|Def Estimated: [15 39 30 16]| Att Labels: [28 23 23 26]\n",
            "\n",
            "|Epoch 003/100| time: 15.30|\n",
            "|Def Loss 0.3763 | Def Reward in ep 061|\n",
            "|Att Loss 2.6920 | Att Reward in ep 039|\n",
            "|Def Estimated: [30 27 17 26]| Att Labels: [30 26 16 28]\n",
            "\n",
            "|Epoch 004/100| time: 13.70|\n",
            "|Def Loss 0.3335 | Def Reward in ep 073|\n",
            "|Att Loss 2.9373 | Att Reward in ep 027|\n",
            "|Def Estimated: [26 26 31 17]| Att Labels: [24 28 30 18]\n",
            "\n",
            "|Epoch 005/100| time: 11.47|\n",
            "|Def Loss 0.2533 | Def Reward in ep 080|\n",
            "|Att Loss 3.0046 | Att Reward in ep 020|\n",
            "|Def Estimated: [24 27 22 27]| Att Labels: [17 32 21 30]\n",
            "\n",
            "|Epoch 006/100| time: 12.62|\n",
            "|Def Loss 0.2496 | Def Reward in ep 088|\n",
            "|Att Loss 2.9508 | Att Reward in ep 012|\n",
            "|Def Estimated: [24 21 31 24]| Att Labels: [21 21 31 27]\n",
            "\n",
            "|Epoch 007/100| time: 13.98|\n",
            "|Def Loss 0.1779 | Def Reward in ep 088|\n",
            "|Att Loss 2.8032 | Att Reward in ep 012|\n",
            "|Def Estimated: [31 25 24 20]| Att Labels: [27 30 24 19]\n",
            "\n",
            "|Epoch 008/100| time: 14.14|\n",
            "|Def Loss 0.2983 | Def Reward in ep 088|\n",
            "|Att Loss 2.6932 | Att Reward in ep 012|\n",
            "|Def Estimated: [31 28 24 17]| Att Labels: [27 31 23 19]\n",
            "\n",
            "|Epoch 009/100| time: 12.51|\n",
            "|Def Loss 0.2829 | Def Reward in ep 097|\n",
            "|Att Loss 2.5322 | Att Reward in ep 003|\n",
            "|Def Estimated: [21 24 27 28]| Att Labels: [22 23 27 28]\n",
            "\n",
            "|Epoch 010/100| time: 13.91|\n",
            "|Def Loss 0.3565 | Def Reward in ep 093|\n",
            "|Att Loss 2.5249 | Att Reward in ep 007|\n",
            "|Def Estimated: [24 19 27 30]| Att Labels: [26 17 28 29]\n",
            "\n",
            "|Epoch 011/100| time: 13.32|\n",
            "|Def Loss 0.3022 | Def Reward in ep 094|\n",
            "|Att Loss 1.9639 | Att Reward in ep 006|\n",
            "|Def Estimated: [28 27 17 28]| Att Labels: [24 29 19 28]\n",
            "\n",
            "|Epoch 012/100| time: 12.67|\n",
            "|Def Loss 0.2833 | Def Reward in ep 095|\n",
            "|Att Loss 1.4044 | Att Reward in ep 005|\n",
            "|Def Estimated: [19 28 11 42]| Att Labels: [22 30 11 37]\n",
            "\n",
            "|Epoch 013/100| time: 12.29|\n",
            "|Def Loss 0.3074 | Def Reward in ep 090|\n",
            "|Att Loss 1.0277 | Att Reward in ep 010|\n",
            "|Def Estimated: [21 25 21 33]| Att Labels: [19 27 21 33]\n",
            "\n",
            "|Epoch 014/100| time: 13.89|\n",
            "|Def Loss 0.3793 | Def Reward in ep 093|\n",
            "|Att Loss 0.6867 | Att Reward in ep 007|\n",
            "|Def Estimated: [23 20 28 29]| Att Labels: [26 20 29 25]\n",
            "\n",
            "|Epoch 015/100| time: 12.68|\n",
            "|Def Loss 0.4719 | Def Reward in ep 091|\n",
            "|Att Loss 0.5906 | Att Reward in ep 009|\n",
            "|Def Estimated: [17 29 23 31]| Att Labels: [22 27 22 29]\n",
            "\n",
            "|Epoch 016/100| time: 13.73|\n",
            "|Def Loss 0.3951 | Def Reward in ep 096|\n",
            "|Att Loss 0.4539 | Att Reward in ep 004|\n",
            "|Def Estimated: [22 22 31 25]| Att Labels: [25 22 30 23]\n",
            "\n",
            "|Epoch 017/100| time: 13.48|\n",
            "|Def Loss 0.2876 | Def Reward in ep 097|\n",
            "|Att Loss 0.4026 | Att Reward in ep 003|\n",
            "|Def Estimated: [21 37 22 20]| Att Labels: [23 34 22 21]\n",
            "\n",
            "|Epoch 018/100| time: 14.79|\n",
            "|Def Loss 0.3821 | Def Reward in ep 092|\n",
            "|Att Loss 0.3405 | Att Reward in ep 008|\n",
            "|Def Estimated: [28 22 26 24]| Att Labels: [29 16 26 29]\n",
            "\n",
            "|Epoch 019/100| time: 14.49|\n",
            "|Def Loss 0.3545 | Def Reward in ep 095|\n",
            "|Att Loss 0.3186 | Att Reward in ep 005|\n",
            "|Def Estimated: [26 15 28 31]| Att Labels: [28 14 29 29]\n",
            "\n",
            "|Epoch 020/100| time: 14.60|\n",
            "|Def Loss 0.4008 | Def Reward in ep 093|\n",
            "|Att Loss 0.2765 | Att Reward in ep 007|\n",
            "|Def Estimated: [23 39 18 20]| Att Labels: [29 34 18 19]\n",
            "\n",
            "|Epoch 021/100| time: 13.39|\n",
            "|Def Loss 0.3425 | Def Reward in ep 095|\n",
            "|Att Loss 0.2465 | Att Reward in ep 005|\n",
            "|Def Estimated: [23 24 32 21]| Att Labels: [24 20 32 24]\n",
            "\n",
            "|Epoch 022/100| time: 11.44|\n",
            "|Def Loss 0.3348 | Def Reward in ep 097|\n",
            "|Att Loss 0.3295 | Att Reward in ep 003|\n",
            "|Def Estimated: [18 24 29 29]| Att Labels: [17 25 29 29]\n",
            "\n",
            "|Epoch 023/100| time: 14.39|\n",
            "|Def Loss 0.3265 | Def Reward in ep 096|\n",
            "|Att Loss 0.2653 | Att Reward in ep 004|\n",
            "|Def Estimated: [23 24 30 23]| Att Labels: [27 20 30 23]\n",
            "\n",
            "|Epoch 024/100| time: 11.80|\n",
            "|Def Loss 0.3771 | Def Reward in ep 097|\n",
            "|Att Loss 0.2545 | Att Reward in ep 003|\n",
            "|Def Estimated: [15 26 28 31]| Att Labels: [17 23 29 31]\n",
            "\n",
            "|Epoch 025/100| time: 14.71|\n",
            "|Def Loss 0.2562 | Def Reward in ep 092|\n",
            "|Att Loss 0.3432 | Att Reward in ep 008|\n",
            "|Def Estimated: [28 26 31 15]| Att Labels: [29 26 32 13]\n",
            "\n",
            "|Epoch 026/100| time: 14.44|\n",
            "|Def Loss 0.2887 | Def Reward in ep 094|\n",
            "|Att Loss 0.2871 | Att Reward in ep 006|\n",
            "|Def Estimated: [26 17 28 29]| Att Labels: [27 17 27 29]\n",
            "\n",
            "|Epoch 027/100| time: 13.94|\n",
            "|Def Loss 0.3363 | Def Reward in ep 096|\n",
            "|Att Loss 0.2511 | Att Reward in ep 004|\n",
            "|Def Estimated: [25 20 25 30]| Att Labels: [26 20 25 29]\n",
            "\n",
            "|Epoch 028/100| time: 13.87|\n",
            "|Def Loss 0.2971 | Def Reward in ep 091|\n",
            "|Att Loss 0.3418 | Att Reward in ep 009|\n",
            "|Def Estimated: [26 23 24 27]| Att Labels: [25 26 24 25]\n",
            "\n",
            "|Epoch 029/100| time: 14.52|\n",
            "|Def Loss 0.2525 | Def Reward in ep 098|\n",
            "|Att Loss 0.2174 | Att Reward in ep 002|\n",
            "|Def Estimated: [29 28 16 27]| Att Labels: [29 28 16 27]\n",
            "\n",
            "|Epoch 030/100| time: 13.87|\n",
            "|Def Loss 0.2281 | Def Reward in ep 093|\n",
            "|Att Loss 0.2550 | Att Reward in ep 007|\n",
            "|Def Estimated: [25 23 28 24]| Att Labels: [26 23 29 22]\n",
            "\n",
            "|Epoch 031/100| time: 15.01|\n",
            "|Def Loss 0.2663 | Def Reward in ep 098|\n",
            "|Att Loss 0.3385 | Att Reward in ep 002|\n",
            "|Def Estimated: [29 21 24 26]| Att Labels: [29 20 24 27]\n",
            "\n",
            "|Epoch 032/100| time: 13.58|\n",
            "|Def Loss 0.2880 | Def Reward in ep 094|\n",
            "|Att Loss 0.2485 | Att Reward in ep 006|\n",
            "|Def Estimated: [22 21 24 33]| Att Labels: [25 21 24 30]\n",
            "\n",
            "|Epoch 033/100| time: 14.08|\n",
            "|Def Loss 0.2579 | Def Reward in ep 098|\n",
            "|Att Loss 0.2032 | Att Reward in ep 002|\n",
            "|Def Estimated: [26 27 18 29]| Att Labels: [27 28 18 27]\n",
            "\n",
            "|Epoch 034/100| time: 16.07|\n",
            "|Def Loss 0.2340 | Def Reward in ep 094|\n",
            "|Att Loss 0.2141 | Att Reward in ep 006|\n",
            "|Def Estimated: [27 28 25 20]| Att Labels: [33 26 25 16]\n",
            "\n",
            "|Epoch 035/100| time: 13.98|\n",
            "|Def Loss 0.2981 | Def Reward in ep 098|\n",
            "|Att Loss 0.3499 | Att Reward in ep 002|\n",
            "|Def Estimated: [24 31 24 21]| Att Labels: [26 29 24 21]\n",
            "\n",
            "|Epoch 036/100| time: 15.50|\n",
            "|Def Loss 0.3520 | Def Reward in ep 096|\n",
            "|Att Loss 0.2671 | Att Reward in ep 004|\n",
            "|Def Estimated: [29 24 23 24]| Att Labels: [31 21 23 25]\n",
            "\n",
            "|Epoch 037/100| time: 14.19|\n",
            "|Def Loss 0.2368 | Def Reward in ep 098|\n",
            "|Att Loss 0.3280 | Att Reward in ep 002|\n",
            "|Def Estimated: [25 28 26 21]| Att Labels: [27 27 26 20]\n",
            "\n",
            "|Epoch 038/100| time: 14.39|\n",
            "|Def Loss 0.2148 | Def Reward in ep 096|\n",
            "|Att Loss 0.3215 | Att Reward in ep 004|\n",
            "|Def Estimated: [26 24 25 25]| Att Labels: [27 23 25 25]\n",
            "\n",
            "|Epoch 039/100| time: 13.48|\n",
            "|Def Loss 0.2428 | Def Reward in ep 096|\n",
            "|Att Loss 0.2720 | Att Reward in ep 004|\n",
            "|Def Estimated: [26 24 25 25]| Att Labels: [24 25 25 26]\n",
            "\n",
            "|Epoch 040/100| time: 13.46|\n",
            "|Def Loss 0.2943 | Def Reward in ep 095|\n",
            "|Att Loss 0.2374 | Att Reward in ep 005|\n",
            "|Def Estimated: [21 30 27 22]| Att Labels: [24 29 27 20]\n",
            "\n",
            "|Epoch 041/100| time: 15.02|\n",
            "|Def Loss 0.2156 | Def Reward in ep 091|\n",
            "|Att Loss 0.2301 | Att Reward in ep 009|\n",
            "|Def Estimated: [28 22 24 26]| Att Labels: [29 24 25 22]\n",
            "\n",
            "|Epoch 042/100| time: 12.05|\n",
            "|Def Loss 0.2945 | Def Reward in ep 098|\n",
            "|Att Loss 0.2477 | Att Reward in ep 002|\n",
            "|Def Estimated: [20 31 25 24]| Att Labels: [18 32 25 25]\n",
            "\n",
            "|Epoch 043/100| time: 14.89|\n",
            "|Def Loss 0.2328 | Def Reward in ep 098|\n",
            "|Att Loss 0.3270 | Att Reward in ep 002|\n",
            "|Def Estimated: [28 25 16 31]| Att Labels: [30 24 16 30]\n",
            "\n",
            "|Epoch 044/100| time: 12.22|\n",
            "|Def Loss 0.2491 | Def Reward in ep 096|\n",
            "|Att Loss 0.2626 | Att Reward in ep 004|\n",
            "|Def Estimated: [18 28 25 29]| Att Labels: [20 26 25 29]\n",
            "\n",
            "|Epoch 045/100| time: 14.91|\n",
            "|Def Loss 0.2366 | Def Reward in ep 097|\n",
            "|Att Loss 0.2325 | Att Reward in ep 003|\n",
            "|Def Estimated: [26 29 24 21]| Att Labels: [29 27 24 20]\n",
            "\n",
            "|Epoch 046/100| time: 14.23|\n",
            "|Def Loss 0.2007 | Def Reward in ep 096|\n",
            "|Att Loss 0.3026 | Att Reward in ep 004|\n",
            "|Def Estimated: [24 30 29 17]| Att Labels: [26 28 29 17]\n",
            "\n",
            "|Epoch 047/100| time: 13.37|\n",
            "|Def Loss 0.2411 | Def Reward in ep 097|\n",
            "|Att Loss 0.2841 | Att Reward in ep 003|\n",
            "|Def Estimated: [23 31 23 23]| Att Labels: [24 29 23 24]\n",
            "\n",
            "|Epoch 048/100| time: 12.89|\n",
            "|Def Loss 0.2334 | Def Reward in ep 099|\n",
            "|Att Loss 0.2435 | Att Reward in ep 001|\n",
            "|Def Estimated: [22 27 26 25]| Att Labels: [21 27 27 25]\n",
            "\n",
            "|Epoch 049/100| time: 13.72|\n",
            "|Def Loss 0.2020 | Def Reward in ep 100|\n",
            "|Att Loss 0.2643 | Att Reward in ep 000|\n",
            "|Def Estimated: [25 29 29 17]| Att Labels: [25 29 29 17]\n",
            "\n",
            "|Epoch 050/100| time: 13.63|\n",
            "|Def Loss 0.1770 | Def Reward in ep 099|\n",
            "|Att Loss 0.2620 | Att Reward in ep 001|\n",
            "|Def Estimated: [23 28 23 26]| Att Labels: [24 28 23 25]\n",
            "\n",
            "|Epoch 051/100| time: 15.19|\n",
            "|Def Loss 0.1364 | Def Reward in ep 097|\n",
            "|Att Loss 0.1698 | Att Reward in ep 003|\n",
            "|Def Estimated: [30 27 26 17]| Att Labels: [31 25 27 17]\n",
            "\n",
            "|Epoch 052/100| time: 12.94|\n",
            "|Def Loss 0.1180 | Def Reward in ep 096|\n",
            "|Att Loss 0.2156 | Att Reward in ep 004|\n",
            "|Def Estimated: [23 25 24 28]| Att Labels: [23 27 24 26]\n",
            "\n",
            "|Epoch 053/100| time: 13.05|\n",
            "|Def Loss 0.1337 | Def Reward in ep 097|\n",
            "|Att Loss 0.1922 | Att Reward in ep 003|\n",
            "|Def Estimated: [20 40 17 23]| Att Labels: [22 37 18 23]\n",
            "\n",
            "|Epoch 054/100| time: 13.69|\n",
            "|Def Loss 0.1944 | Def Reward in ep 098|\n",
            "|Att Loss 0.1438 | Att Reward in ep 002|\n",
            "|Def Estimated: [24 27 26 23]| Att Labels: [25 28 26 21]\n",
            "\n",
            "|Epoch 055/100| time: 12.54|\n",
            "|Def Loss 0.1522 | Def Reward in ep 099|\n",
            "|Att Loss 0.1357 | Att Reward in ep 001|\n",
            "|Def Estimated: [20 28 23 29]| Att Labels: [21 27 23 29]\n",
            "\n",
            "|Epoch 056/100| time: 15.00|\n",
            "|Def Loss 0.1248 | Def Reward in ep 099|\n",
            "|Att Loss 0.1470 | Att Reward in ep 001|\n",
            "|Def Estimated: [30 27 19 24]| Att Labels: [30 28 19 23]\n",
            "\n",
            "|Epoch 057/100| time: 14.14|\n",
            "|Def Loss 0.0987 | Def Reward in ep 098|\n",
            "|Att Loss 0.2231 | Att Reward in ep 002|\n",
            "|Def Estimated: [27 27 15 31]| Att Labels: [27 26 15 32]\n",
            "\n",
            "|Epoch 058/100| time: 14.48|\n",
            "|Def Loss 0.0888 | Def Reward in ep 095|\n",
            "|Att Loss 0.1862 | Att Reward in ep 005|\n",
            "|Def Estimated: [24 23 26 27]| Att Labels: [28 20 26 26]\n",
            "\n",
            "|Epoch 059/100| time: 12.76|\n",
            "|Def Loss 0.1370 | Def Reward in ep 100|\n",
            "|Att Loss 0.1344 | Att Reward in ep 000|\n",
            "|Def Estimated: [22 30 25 23]| Att Labels: [22 30 25 23]\n",
            "\n",
            "|Epoch 060/100| time: 14.09|\n",
            "|Def Loss 0.1379 | Def Reward in ep 097|\n",
            "|Att Loss 0.1164 | Att Reward in ep 003|\n",
            "|Def Estimated: [25 23 17 35]| Att Labels: [27 22 17 34]\n",
            "\n",
            "|Epoch 061/100| time: 15.18|\n",
            "|Def Loss 0.0754 | Def Reward in ep 100|\n",
            "|Att Loss 0.1164 | Att Reward in ep 000|\n",
            "|Def Estimated: [30 16 34 20]| Att Labels: [30 16 34 20]\n",
            "\n",
            "|Epoch 062/100| time: 10.98|\n",
            "|Def Loss 0.1158 | Def Reward in ep 097|\n",
            "|Att Loss 0.1754 | Att Reward in ep 003|\n",
            "|Def Estimated: [16 26 30 28]| Att Labels: [15 27 30 28]\n",
            "\n",
            "|Epoch 063/100| time: 14.58|\n",
            "|Def Loss 0.0991 | Def Reward in ep 096|\n",
            "|Att Loss 0.1914 | Att Reward in ep 004|\n",
            "|Def Estimated: [25 23 28 24]| Att Labels: [28 20 27 25]\n",
            "\n",
            "|Epoch 064/100| time: 14.40|\n",
            "|Def Loss 0.1339 | Def Reward in ep 100|\n",
            "|Att Loss 0.1390 | Att Reward in ep 000|\n",
            "|Def Estimated: [27 21 21 31]| Att Labels: [27 21 21 31]\n",
            "\n",
            "|Epoch 065/100| time: 12.23|\n",
            "|Def Loss 0.1302 | Def Reward in ep 098|\n",
            "|Att Loss 0.1470 | Att Reward in ep 002|\n",
            "|Def Estimated: [18 22 26 34]| Att Labels: [20 21 25 34]\n",
            "\n",
            "|Epoch 066/100| time: 14.80|\n",
            "|Def Loss 0.1019 | Def Reward in ep 097|\n",
            "|Att Loss 0.1572 | Att Reward in ep 003|\n",
            "|Def Estimated: [30 22 27 21]| Att Labels: [29 21 28 22]\n",
            "\n",
            "|Epoch 067/100| time: 15.03|\n",
            "|Def Loss 0.1473 | Def Reward in ep 097|\n",
            "|Att Loss 0.1676 | Att Reward in ep 003|\n",
            "|Def Estimated: [31 20 26 23]| Att Labels: [30 20 28 22]\n",
            "\n",
            "|Epoch 068/100| time: 14.11|\n",
            "|Def Loss 0.1473 | Def Reward in ep 099|\n",
            "|Att Loss 0.1558 | Att Reward in ep 001|\n",
            "|Def Estimated: [25 30 34 11]| Att Labels: [26 29 34 11]\n",
            "\n",
            "|Epoch 069/100| time: 16.24|\n",
            "|Def Loss 0.1047 | Def Reward in ep 096|\n",
            "|Att Loss 0.2329 | Att Reward in ep 004|\n",
            "|Def Estimated: [36 23 18 23]| Att Labels: [35 23 17 25]\n",
            "\n",
            "|Epoch 070/100| time: 13.94|\n",
            "|Def Loss 0.1451 | Def Reward in ep 099|\n",
            "|Att Loss 0.2242 | Att Reward in ep 001|\n",
            "|Def Estimated: [27 21 29 23]| Att Labels: [26 22 29 23]\n",
            "\n",
            "|Epoch 071/100| time: 13.36|\n",
            "|Def Loss 0.1825 | Def Reward in ep 098|\n",
            "|Att Loss 0.1619 | Att Reward in ep 002|\n",
            "|Def Estimated: [21 30 24 25]| Att Labels: [23 29 24 24]\n",
            "\n",
            "|Epoch 072/100| time: 13.12|\n",
            "|Def Loss 0.0490 | Def Reward in ep 098|\n",
            "|Att Loss 0.1974 | Att Reward in ep 002|\n",
            "|Def Estimated: [22 30 30 18]| Att Labels: [22 31 29 18]\n",
            "\n",
            "|Epoch 073/100| time: 14.62|\n",
            "|Def Loss 0.1602 | Def Reward in ep 098|\n",
            "|Att Loss 0.2021 | Att Reward in ep 002|\n",
            "|Def Estimated: [30 24 19 27]| Att Labels: [29 26 19 26]\n",
            "\n",
            "|Epoch 074/100| time: 12.87|\n",
            "|Def Loss 0.0819 | Def Reward in ep 099|\n",
            "|Att Loss 0.1875 | Att Reward in ep 001|\n",
            "|Def Estimated: [22 28 26 24]| Att Labels: [23 27 26 24]\n",
            "\n",
            "|Epoch 075/100| time: 13.10|\n",
            "|Def Loss 0.0647 | Def Reward in ep 099|\n",
            "|Att Loss 0.1494 | Att Reward in ep 001|\n",
            "|Def Estimated: [21 25 26 28]| Att Labels: [22 24 26 28]\n",
            "\n",
            "|Epoch 076/100| time: 14.69|\n",
            "|Def Loss 0.0547 | Def Reward in ep 100|\n",
            "|Att Loss 0.2344 | Att Reward in ep 000|\n",
            "|Def Estimated: [29 21 22 28]| Att Labels: [29 21 22 28]\n",
            "\n",
            "|Epoch 077/100| time: 15.95|\n",
            "|Def Loss 0.0839 | Def Reward in ep 098|\n",
            "|Att Loss 0.1654 | Att Reward in ep 002|\n",
            "|Def Estimated: [33 28 19 20]| Att Labels: [33 28 19 20]\n",
            "\n",
            "|Epoch 078/100| time: 16.10|\n",
            "|Def Loss 0.0752 | Def Reward in ep 098|\n",
            "|Att Loss 0.1463 | Att Reward in ep 002|\n",
            "|Def Estimated: [32 30 21 17]| Att Labels: [34 28 21 17]\n",
            "\n",
            "|Epoch 079/100| time: 12.32|\n",
            "|Def Loss 0.0384 | Def Reward in ep 098|\n",
            "|Att Loss 0.1448 | Att Reward in ep 002|\n",
            "|Def Estimated: [19 28 31 22]| Att Labels: [19 27 32 22]\n",
            "\n",
            "|Epoch 080/100| time: 13.20|\n",
            "|Def Loss 0.0806 | Def Reward in ep 100|\n",
            "|Att Loss 0.1777 | Att Reward in ep 000|\n",
            "|Def Estimated: [23 22 32 23]| Att Labels: [23 22 32 23]\n",
            "\n",
            "|Epoch 081/100| time: 12.27|\n",
            "|Def Loss 0.0509 | Def Reward in ep 097|\n",
            "|Att Loss 0.1675 | Att Reward in ep 003|\n",
            "|Def Estimated: [20 32 25 23]| Att Labels: [20 32 24 24]\n",
            "\n",
            "|Epoch 082/100| time: 15.24|\n",
            "|Def Loss 0.0480 | Def Reward in ep 098|\n",
            "|Att Loss 0.1212 | Att Reward in ep 002|\n",
            "|Def Estimated: [30 24 20 26]| Att Labels: [31 23 21 25]\n",
            "\n",
            "|Epoch 083/100| time: 12.51|\n",
            "|Def Loss 0.0928 | Def Reward in ep 099|\n",
            "|Att Loss 0.1060 | Att Reward in ep 001|\n",
            "|Def Estimated: [20 26 27 27]| Att Labels: [21 25 27 27]\n",
            "\n",
            "|Epoch 084/100| time: 12.89|\n",
            "|Def Loss 0.0836 | Def Reward in ep 100|\n",
            "|Att Loss 0.1764 | Att Reward in ep 000|\n",
            "|Def Estimated: [22 20 29 29]| Att Labels: [22 20 29 29]\n",
            "\n",
            "|Epoch 085/100| time: 13.89|\n",
            "|Def Loss 0.0637 | Def Reward in ep 100|\n",
            "|Att Loss 0.0720 | Att Reward in ep 000|\n",
            "|Def Estimated: [25 28 16 31]| Att Labels: [25 28 16 31]\n",
            "\n",
            "|Epoch 086/100| time: 14.44|\n",
            "|Def Loss 0.0753 | Def Reward in ep 098|\n",
            "|Att Loss 0.0268 | Att Reward in ep 002|\n",
            "|Def Estimated: [27 20 22 31]| Att Labels: [28 19 22 31]\n",
            "\n",
            "|Epoch 087/100| time: 13.36|\n",
            "|Def Loss 0.0208 | Def Reward in ep 100|\n",
            "|Att Loss 0.0909 | Att Reward in ep 000|\n",
            "|Def Estimated: [23 22 23 32]| Att Labels: [23 22 23 32]\n",
            "\n",
            "|Epoch 088/100| time: 13.60|\n",
            "|Def Loss 0.0408 | Def Reward in ep 098|\n",
            "|Att Loss 0.0911 | Att Reward in ep 002|\n",
            "|Def Estimated: [25 26 24 25]| Att Labels: [25 26 24 25]\n",
            "\n",
            "|Epoch 089/100| time: 13.58|\n",
            "|Def Loss 0.0379 | Def Reward in ep 097|\n",
            "|Att Loss 0.1452 | Att Reward in ep 003|\n",
            "|Def Estimated: [24 24 29 23]| Att Labels: [25 24 29 22]\n",
            "\n",
            "|Epoch 090/100| time: 14.00|\n",
            "|Def Loss 0.0379 | Def Reward in ep 099|\n",
            "|Att Loss 0.1005 | Att Reward in ep 001|\n",
            "|Def Estimated: [25 25 31 19]| Att Labels: [25 25 30 20]\n",
            "\n",
            "|Epoch 091/100| time: 11.75|\n",
            "|Def Loss 0.0690 | Def Reward in ep 099|\n",
            "|Att Loss 0.0894 | Att Reward in ep 001|\n",
            "|Def Estimated: [16 25 24 35]| Att Labels: [17 25 24 34]\n",
            "\n",
            "|Epoch 092/100| time: 13.38|\n",
            "|Def Loss 0.0697 | Def Reward in ep 096|\n",
            "|Att Loss 0.1760 | Att Reward in ep 004|\n",
            "|Def Estimated: [24 29 24 23]| Att Labels: [24 27 25 24]\n",
            "\n",
            "|Epoch 093/100| time: 17.52|\n",
            "|Def Loss 0.0690 | Def Reward in ep 097|\n",
            "|Att Loss 0.1664 | Att Reward in ep 003|\n",
            "|Def Estimated: [37 13 27 23]| Att Labels: [39 12 26 23]\n",
            "\n",
            "|Epoch 094/100| time: 13.09|\n",
            "|Def Loss 0.0505 | Def Reward in ep 096|\n",
            "|Att Loss 0.1073 | Att Reward in ep 004|\n",
            "|Def Estimated: [22 30 26 22]| Att Labels: [22 30 26 22]\n",
            "\n",
            "|Epoch 095/100| time: 14.52|\n",
            "|Def Loss 0.0853 | Def Reward in ep 097|\n",
            "|Att Loss 0.2667 | Att Reward in ep 003|\n",
            "|Def Estimated: [27 26 24 23]| Att Labels: [28 24 25 23]\n",
            "\n",
            "|Epoch 096/100| time: 14.00|\n",
            "|Def Loss 0.1015 | Def Reward in ep 100|\n",
            "|Att Loss 0.2213 | Att Reward in ep 000|\n",
            "|Def Estimated: [26 30 20 24]| Att Labels: [26 30 20 24]\n",
            "\n",
            "|Epoch 097/100| time: 15.30|\n",
            "|Def Loss 0.1391 | Def Reward in ep 097|\n",
            "|Att Loss 0.3120 | Att Reward in ep 003|\n",
            "|Def Estimated: [29 28 29 14]| Att Labels: [30 28 27 15]\n",
            "\n",
            "|Epoch 098/100| time: 14.18|\n",
            "|Def Loss 0.0703 | Def Reward in ep 098|\n",
            "|Att Loss 0.2772 | Att Reward in ep 002|\n",
            "|Def Estimated: [26 26 24 24]| Att Labels: [27 24 25 24]\n",
            "\n",
            "|Epoch 099/100| time: 11.64|\n",
            "|Def Loss 0.1266 | Def Reward in ep 098|\n",
            "|Att Loss 0.2063 | Att Reward in ep 002|\n",
            "|Def Estimated: [15 25 30 30]| Att Labels: [17 23 30 30]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "w56BPg3zo0DC",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "W2QzwrilomWO",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "OoBlm8f7fW_C",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 297
        },
        "outputId": "05fe02ca-5f9a-401d-b1e1-188da8905eb3"
      },
      "cell_type": "code",
      "source": [
        "if not os.path.exists('models'):\n",
        "    os.makedirs('models')\n",
        "# Save trained model weights and architecture, used in test\n",
        "defender_agent.model_network.model.save_weights(\"models/defender_agent_model.h5\", overwrite=True)\n",
        "with open(\"models/defender_agent_model.json\", \"w\") as outfile:\n",
        "    json.dump(defender_agent.model_network.model.to_json(), outfile)\n",
        "\n",
        "\n",
        "    \n",
        "if not os.path.exists('results'):\n",
        "    os.makedirs('results')    \n",
        "# Plot training results\n",
        "plt.figure(1)\n",
        "plt.subplot(211)\n",
        "plt.plot(np.arange(len(def_reward_chain)),def_reward_chain,label='Defense')\n",
        "plt.plot(np.arange(len(att_reward_chain)),att_reward_chain,label='Attack')\n",
        "plt.title('Total reward by episode')\n",
        "plt.xlabel('n Episode')\n",
        "plt.ylabel('Total reward')\n",
        "plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,\n",
        "       ncol=2, mode=\"expand\", borderaxespad=0.)\n",
        "\n",
        "plt.subplot(212)\n",
        "plt.plot(np.arange(len(def_loss_chain)),def_loss_chain,label='Defense')\n",
        "plt.plot(np.arange(len(att_loss_chain)),att_loss_chain,label='Attack')\n",
        "plt.title('Loss by episode')\n",
        "plt.xlabel('n Episode')\n",
        "plt.ylabel('loss')\n",
        "plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,\n",
        "       ncol=2, mode=\"expand\", borderaxespad=0.)\n",
        "plt.tight_layout()\n",
        "#plt.show()\n",
        "plt.savefig('results/train_adv.tif', format='tif', dpi=100)"
      ],
      "execution_count": 88,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nB6rzQoSVCN0AAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "HHpLDW9kfeQL",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1082
        },
        "outputId": "08d27245-aafb-4856-b9e7-9e73cb88ac0d"
      },
      "cell_type": "code",
      "source": [
        "bins=np.arange(5) -0.5\n",
        "# Plot attacks distribution alongside\n",
        "plt.figure(2,figsize=[12,5])\n",
        "plt.title(\"Attacks distribution throughout  episodes\")\n",
        "for indx,e in enumerate([0,70,90]):\n",
        "    plt.subplot(1,3,indx+1)\n",
        "    plt.hist(attacks_by_epoch[e],bins=bins,width=0.9,align='left')\n",
        "    plt.xlabel(\"{} epoch\".format(e))\n",
        "    plt.xticks(bins, env.attack_names, rotation=90)\n",
        "\n",
        "\n",
        "plt.tight_layout()\n",
        "plt.savefig('results/Attacks_distribution.svg', format='svg', dpi=1000)\n",
        "\n",
        "\n",
        " # Plot attacks distribution alongside\n",
        "plt.figure(3,figsize=[10,10])\n",
        "plt.title(\"Attacks (mapped) distribution throughout  episodes\")\n",
        "for indx,e in enumerate([0,10,20,30,40,60,70,80,90]):\n",
        "    plt.subplot(3,3,indx+1)\n",
        "    plt.bar(range(4),attack_labels_list[e],tick_label =['normal', 'flooding', 'injection', 'impersonation'])\n",
        "    plt.xlabel(\"{} epoch\".format(e))\n",
        "plt.tight_layout()\n",
        "plt.savefig('results/Attacks_mapped_distribution.tif', format='tif', dpi=100)"
      ],
      "execution_count": 89,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 864x360 with 3 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 720x720 with 9 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "GdEEgnejoANJ",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "MLhFt4v2oA5r",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "-3z12k-CoBqI",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# TEST"
      ]
    },
    {
      "metadata": {
        "id": "k2EScB5ZoA8t",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "from keras.models import model_from_json\n",
        "\n",
        "import itertools\n",
        "from sklearn.metrics import f1_score\n",
        "from sklearn.metrics import accuracy_score, precision_score, recall_score\n",
        "from sklearn.metrics import  confusion_matrix"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "i1PgEGysoOlU",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "\n",
        "def plot_confusion_matrix(cm, classes,\n",
        "                          normalize=False,\n",
        "                          title='Confusion matrix',\n",
        "                          cmap=plt.cm.Blues):\n",
        "    \"\"\"\n",
        "    This function prints and plots the confusion matrix.\n",
        "    Normalization can be applied by setting `normalize=True`.\n",
        "    \"\"\"\n",
        "    if normalize:\n",
        "        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
        "        print(\"Normalized confusion matrix\")\n",
        "    else:\n",
        "        print('Confusion matrix, without normalization')\n",
        "\n",
        "    print(cm)\n",
        "\n",
        "    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
        "    plt.title(title)\n",
        "    plt.grid(None)\n",
        "    plt.colorbar()\n",
        "    tick_marks = np.arange(len(classes))\n",
        "    plt.xticks(tick_marks, classes, rotation=45)\n",
        "    plt.yticks(tick_marks, classes)\n",
        "\n",
        "    fmt = '.2f' if normalize else 'd'\n",
        "    thresh = cm.max() / 2.\n",
        "    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
        "        plt.text(j, i, format(cm[i, j], fmt),\n",
        "                 horizontalalignment=\"center\",\n",
        "                 color=\"white\" if cm[i, j] > thresh else \"black\")\n",
        "\n",
        "    plt.tight_layout()\n",
        "    plt.ylabel('True label')\n",
        "    plt.xlabel('Predicted label')\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "5cSeFJb3oPVT",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "\n",
        "with open(\"models/defender_agent_model.json\", \"r\") as jfile:\n",
        "    model = model_from_json(json.load(jfile))\n",
        "model.load_weights(\"models/defender_agent_model.h5\")\n",
        "\n",
        "model.compile(loss=huber_loss,optimizer=\"sgd\")\n",
        "\n",
        "\n",
        "# Define environment, game, make sure the batch_size is the same in train\n",
        "env_test = RLenv('test')\n",
        "\n",
        "\n",
        "total_reward = 0    \n",
        "\n",
        "\n",
        "true_labels = np.zeros(len(env_test.attack_types),dtype=int)\n",
        "estimated_labels = np.zeros(len(env_test.attack_types),dtype=int)\n",
        "estimated_correct_labels = np.zeros(len(env_test.attack_types),dtype=int)\n",
        "\n",
        "#states , labels = env.get_sequential_batch(test_path,batch_size = env.batch_size)\n",
        "states , labels = env_test.get_full()\n",
        "\n",
        "\n",
        "start_time=time.time()\n",
        "q = model.predict(states)\n",
        "actions = np.argmax(q,axis=1)        "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "8hFU1HF1oYFG",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 134
        },
        "outputId": "0645ee32-8e18-4308-9076-277b653ffde1"
      },
      "cell_type": "code",
      "source": [
        "maped=[]\n",
        "for indx,label in labels.iterrows():\n",
        "    maped.append(env_test.attack_types.index(env_test.attack_map[label.idxmax()]))\n",
        "\n",
        "labels,counts = np.unique(maped,return_counts=True)\n",
        "true_labels[labels] += counts\n",
        "\n",
        "\n",
        "\n",
        "for indx,a in enumerate(actions):\n",
        "    estimated_labels[a] +=1              \n",
        "    if a == maped[indx]:\n",
        "        total_reward += 1\n",
        "        estimated_correct_labels[a] += 1\n",
        "\n",
        "\n",
        "action_dummies = pd.get_dummies(actions)\n",
        "posible_actions = np.arange(len(env_test.attack_types))\n",
        "for non_existing_action in posible_actions:\n",
        "    if non_existing_action not in action_dummies.columns:\n",
        "        action_dummies[non_existing_action] = np.uint8(0)\n",
        "labels_dummies = pd.get_dummies(maped)\n",
        "\n",
        "normal_f1_score = f1_score(labels_dummies[0].values,action_dummies[0].values)\n",
        "flooding_f1_score = f1_score(labels_dummies[1].values,action_dummies[1].values)\n",
        "injection_f1_score = f1_score(labels_dummies[2].values,action_dummies[2].values)\n",
        "impersonation_f1_score = f1_score(labels_dummies[3].values,action_dummies[3].values)\n",
        "    \n",
        "\n",
        "Accuracy = [normal_f1_score,flooding_f1_score,injection_f1_score,impersonation_f1_score]\n",
        "Mismatch = estimated_labels - true_labels\n",
        "\n",
        "acc = float(100*total_reward/len(states))\n",
        "print('\\r\\nTotal reward: {} | Number of samples: {} | Accuracy = {:.2f}%'.format(total_reward,\n",
        "      len(states),acc))\n",
        "outputs_df = pd.DataFrame(index = env_test.attack_types,columns = [\"Estimated\",\"Correct\",\"Total\",\"F1_score\"])\n",
        "for indx,att in enumerate(env_test.attack_types):\n",
        "   outputs_df.iloc[indx].Estimated = estimated_labels[indx]\n",
        "   outputs_df.iloc[indx].Correct = estimated_correct_labels[indx]\n",
        "   outputs_df.iloc[indx].Total = true_labels[indx]\n",
        "   outputs_df.iloc[indx].F1_score = Accuracy[indx]*100\n",
        "   outputs_df.iloc[indx].Mismatch = abs(Mismatch[indx])\n",
        "    \n",
        "    \n",
        "print(outputs_df)"
      ],
      "execution_count": 93,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\r\n",
            "Total reward: 541131 | Number of samples: 575643 | Accuracy = 94.00%\n",
            "              Estimated Correct   Total F1_score\n",
            "normal           524979  510626  530785  96.7311\n",
            "flooding           5296    5006    8097  74.7555\n",
            "injection         17825   16681   16682  96.6818\n",
            "impersonation     27543    8818   20079  37.0333\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "HBxETWRcocbS",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 441
        },
        "outputId": "e73fa46e-23ed-4ea8-ae29-99ce8b0fd15a"
      },
      "cell_type": "code",
      "source": [
        "fig, ax = plt.subplots()\n",
        "fig.set_size_inches(10, 6)\n",
        "width = 0.35\n",
        "pos = np.arange(len(true_labels))\n",
        "p1 = plt.bar(pos, estimated_correct_labels,width,color='g')\n",
        "p1 = plt.bar(pos+width,\n",
        "             (np.abs(estimated_correct_labels-true_labels)),width,\n",
        "             color='r')\n",
        "p2 = plt.bar(pos+width,np.abs(estimated_labels-estimated_correct_labels),width,\n",
        "             bottom=(np.abs(estimated_correct_labels-true_labels)),\n",
        "             color='b')\n",
        "\n",
        "ax.yaxis.set_tick_params(labelsize=15)\n",
        "ax.set_xticks(pos+width/2)\n",
        "ax.set_xticklabels(env.attack_types,rotation='vertical',fontsize = 'xx-large')\n",
        "\n",
        "#ax.set_yscale('log')\n",
        "\n",
        "#ax.set_ylim([0, 100])\n",
        "#ax.set_title('Test set scores',fontsize = 'xx-large')\n",
        "#ax.set_title('Test set scores, Acc = {:.2f}'.format(acc))\n",
        "plt.legend(('Correct estimated','False negative','False positive'),fontsize = 'x-large')\n",
        "plt.tight_layout()\n",
        "#plt.show()\n",
        "plt.savefig('results/test_adv_imp.tif', format='tif', dpi=100)\n"
      ],
      "execution_count": 94,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAAGoCAYAAABbtxOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xl8VNX9//FXIICCIChBUFHcelrX\nSl3Q4oKiqFjrF3fcf1pxA63i1qqIimhditSiIq60arVuoLhQFURxqft+XOvGFiAQFoWEzO+PO8QL\nBBIgmdHk9Xw8eGRyz51zPzNcyHtOzj23IJPJIEmSJCnRKN8FSJIkST8lBmRJkiQpxYAsSZIkpRiQ\nJUmSpBQDsiRJkpRSmO8CfgqKi+e4lEctatOmOSUl8/NdhhoYzzvlmueccs1zrvYVFbUsqGq7I8iq\ndYWFjfNdghogzzvlmueccs1zLncMyJIkSVKKAVmSJElKMSBLkiRJKQZkSZIkKcWALEmSJKUYkCVJ\nkqQUA7IkSZKUYkCWJEmSUgzIkiRJUooBWZIkSUoxIEuSJEkpBmRJkiQppTDfBTRU7Ya1yncJdSYz\nIJPvEiRJPxH5+Hk37fTSnB+zPpoyZTK9ex/CzTffQQi/zHc5VeradQeuuOJqunXrXqv9GpAlSVKD\nN3nyJO6++3ZeffVlZs+eTcuWLfn1r7fnuONOYrPNNs93eZXmzJnD2LFP0avXYXXS/5gxo9lppy60\nbVtE+/YdeO65iXVyHIBPP41Mn17MLrt0rbNjrCqnWEiSpAbtyy+/4KSTjqWgoICbb76dZ599kVtu\nuYOWLVvRp88JfPTRB/kusdIbb7zGI488WCd9L1q0iKFDb2D69OI66X9pjz/+GC+//FJOjrWyajSC\nHEL4H7ABsGippm1jjJ+EEI4CzgO2AKYADwCXxhgXZZ/fFhgK7A60AN4CzosxvpE6Rp33IUmStLQb\nbriGLbYIXHDBxZXbOnRYn/79L6JFi7WYMWMGABUVFdx//z8YPfpRpk6dSrt263HMMcdx4IEHAzBo\n0GUsWrSIefPm8tZbb/LMM+M588xTCOFXvP/+u8yfP4+RIx9g3ry5/O1vf+W1116htHQ2W2zxC/r1\nO5df/WorAEpLZ3PjjdcxceJLNGpUwC67dOWcc87n0UefZcCAP1FRUcFee+3KjTfezDbbbLfM63n8\n8cd48MH7+O67b2ndug29eh1O797HAlBSUsL111/NW2+9zsKFC9l44004/fR+dO68A927d6WsrIzT\nTjuJnj0P4uijj+ewww5ixIh7+OUvt+TQQ3/HEUcczauvTuTtt99kvfXaM3DgYCZMGMdDD/2LTCbD\n8cefzOGHHwXAlClTGDLkL7z//ruUlZXxy19uxbnnXsBGG23MNddcyeOPP0ajRo148snHGTt2AmVl\nZQwfPoxx455j5szpdOy4MaeeeiZduuwKwOzZs7jqqoG89dabtG7dmjPP/GOdnRMrM4L8hxjjGkv9\n+SSEsAdwNzAYaAv0Ao4BLk499wGgCOgCdAReAp4OIawLkMM+JEmSKpWUlPDWW29wxBG9q2w/7bS+\ndO26OwCjRj3MvfeO5JJLLueZZ8Zz2mlncu21g3n77Tcr93/llYnsvXcPnnrq+cpt//nPU/Tpcwb3\n3PMvAAYPvoKpU6cwYsQ9PPHEs+y4YxfOO+9sFiz4obJ91qzZ/Otfj/DPfz7EV1/9j5tuGsLBBx/M\nccf9Pzp12oTnnptYZTieOPFFhg69gT/+8Xyefno8l112FSNH3sm4cc8CMHz4MObPn8cDDzzGk08+\nz/779+Tyyy+hvLyce+99CICbb76d/v0vqvL9eOihBzjllNMZNeppmjVbg/PPP5tmzZrxyCNPcuSR\nx3DzzUOZN28uANdccwWFhYU89NDjPPbY07RsuRZXX30FABdccDHbbbc9v/99L8aOnVBZ2+uvv8qN\nNw7j6afHc+ihh/OnP/WvHNEeOvQGZsyYwb/+9QgjRtzD2LFP1eSveJXUxhSLvsCYGOODMcYFMcb3\ngBuAviGERiGErYFuJKO938YY5wIDgQxJgM1JH7XwOiVJUj0zadJ3AGy00cbV7vvYYw9z0EH/x5Zb\nbk1hYSF77LEX2223Pf/5zzOV+7Rq1Yp9992PRo1+jB6bbLIZnTvvQEFBAbNmzWL8+Of4wx9OY511\n1qVZs2aceOIfyGQqmDjxRWbPnsVLL73AccedSKtWa9O6dWsuuuhS9txz7xq9nscee4h9992fX/+6\nM40bN2brrbfhgAN+x5gxowGYO3cOhYVNaNZsDQoLCznkkCN45JExFBbW7LK0nXfuwi9+8UuaN2/B\nDjvsyPz58znyyGNo0qQJXbvuQVlZGVOnTgHg6quv55JLLqdZszVYY4012H33vfj44w+r7LeiooLR\nox/hmGNOZP31N6CwsJADDzyYTp025ZlnkiA8btyzHHbYkbRpsw6tWq3NccedWKOaV8XKXKR3eAjh\nfJKpFp8Bl8cYHyMZ0R221L6vAeuSTHXoAiwE3lncGGMsDyG8mW27MUd9xOW9sDZtmlNY2Lial6+V\nUVTUMt8lqAHyvFOuec79NK3M30ubNs0BWHvtNap93uTJk9h22y2X2G/zzTdl0qRJFBW1ZI01mrDx\nxhst0d60aSGdOnWq3Pbdd5+TyWQ488xTlui7oqKCuXNL+P77WVRUVLD11r+ofE5R0a8r92vRohmF\nhY2XW+ukSd/y6qsvM2bMqMptmUyGTTbZhKKilvTtezqnn346hxzSk1133ZU999yT/fbbj8LCQhYs\naAFA69bNKSpqucz3jRs3YpNNfnx966yzNuut14711lsbgAUL1gWgefNCiopa8vbbn3P99dfz0Ucf\nsWDBAjKZDGVlZZXPb9q0kDXXbEpRUUuKi4uZO3cuV155KYMGDVii9tLSGRQWlrNgwQK22urH96V1\n62QEvVWrNWv932JNA/K7JKH4eGAByWjtIyGEXUmmPcxcav/p2a/tsu0lMcal1/6aDrTPPs5FH8sN\nyCUl85fXpFVUXDwn3yWogUn+g/W8U+54zv10rczfy1prtaWgoIA333yPli2LVrjvwoULKS39YYn+\nv/++jIULF1FcPIcffigjkylYon3hwnLKyzOV2+bPTy6L+sc/HmT99TdY5hgxflz5Gho3brFEW1FR\nS+bNW0B5+aLlvsbCwiYce+yJnHRSn2Xaiovn0K7dRtx//6P897+v8vLLL3LFFVdw1133cNNNw5k5\ncx4As2bNp7h4zjLfL1pUwfz5ZZXHnjdvARUVP7629P5ffjmZk046ie7d92PAgKtYe+3WPPvsMwwY\n8KfK/RcuLOf77xdSXDyHuXPLAbj++r/RufMOy9Q+ZUoyzWLGjLmp5y8EoLT0+1X+t7i8YF2jqQcx\nxoNijOfEGItjjKUxxkHA28AfqnlqdQvi1mTB3Fz0IUmSGqBWrVqx4447849/3E0ms2xcGDToMu66\nawQA66+/IV988dkS7V9++TkdO3as8fHWX399GjduzKeffrLE9sVTPTp06ECjRo345pv/VbZ9/vln\nPPbYwzXqf8MNN+LTT5ccE5w+vZiysjIgWSYOYJddfss551zArbfexXvvvcNnn31a49dQE//735fM\nnTuX3r2PZe21WwMQ40fL3X+ttdaides2y9Q+efIkMpkMrVu3obCwsHL6BrDM30VtWp25uZ+RTLeY\nSjKNIa1t9uuUbHubEEJBFfssfpW56EOSJGkZZ5/dn0mTvuXcc/vy9ddfkclkmDx5EtdcM4iXX36p\ncv5vz54H8fjjjxLjx5SXl/PMM0/y4Yfvs//+B9b4WC1arEWPHgdw22038803X1NeXs7jjz/Gcccd\nwfTp02nVam12370bd945gpkzZ1BaOpshQ66tXGquWbNmlJSUMGvWrMqL+tJ69TqMl19+ibFjn6K8\nvJwvv/yCM874Q+XScH36nMDw4cP4/vvvqaio4MMP36dp06a0b9+eZs2aAfD1119XXmi3qtq3b0+j\nRo149923WbBgAWPHPsUHH7wPQHHxtOxrWYPJkycxZ84cFi1aRK9eh3HvvSP5+OOPWLRoES+9NIFj\njz2cTz6JFBYWstNOXfj3v+9n1qxZzJo1i5Ej76SgYOloWDuqnWIRQtgE6A/8OcY4K9X0K2A8MItk\n/m9aV2Ay8Hn2GE2BzsAb2T6bAjsCiy+RnJiDPiRJUo79HO5qt9FGnRgxYiR33DGcfv1OpbS0lNat\nW7PTTl0YMeIe2rfvAMARR/Rm7tw5XHrphZSUlLDRRhtz7bU38stfbrlSxzvrrHO58cbr6dPnRMrK\nyth008249tobads2Gdf7058GcP31gznyyF40bdqUXXftSt++yZJmu+/ejUcffYhevXoycOAgdttt\nzyX63n7733DeeRdx++3DGTz4ctZdty09ex7EYYclS69dccU1DBlyLb///X7Z174xgwb9pXKUt1u3\n7gwePJDddtuT007ru8rvadu2RZxxxlncdNMQhgy5lm7d9mHQoGs566xTOfbYw/nHPx6kZ8+DuOaa\nKzjssIO4995/c+yxJzJv3jzOP/9s5s+fx4YbbsTFFw+svIvfBRdczKBBAznssINo3boNffv+kdde\ne3WVa1yRgqp+nZAWQmgOfAK8QDL3+AfgXODPwLZAm2zbscCjwDbA48B1Mcbrsn2MAdYkWXFiDskK\nFIcDv4oxloYQuuSij+UpLp6T8ykY9f1W087LU645H1S55jmnXPOcq31FRS2rHIKudopFjHE+sA+w\nFvAxUAzsC+wRE68ARwKXAKXAwyQ39Lg+1U1v4BvgfZIR3a2BfWKMpdlj5KoPSZIkaYWqHUFuCBxB\nrl2OICsfHFlRrnnOKdc852rfKo8gS5IkSQ2JAVmSJElKMSBLkiRJKQZkSZIkKcWALEmSJKUYkCVJ\nkqQUA7IkSZKUUu2tpiVJklZVUbvcr/tfPC23t7d+883X6dfvVB5//D+0bt06p8fOtWuuuZLZs2dz\n1VXX5ruUOmVAliRJDdqhh/6O4uJpNG7ceJm2kSMfYIMNNsxDVT8NkydP4r333mXfffcD4IILLs5z\nRblhQJYkSQ1enz5n0rv3sfku4ydn3LjneOut1ysDckNhQJYkSarG88//h7vuup1Jk76jefPmdO/e\ng9NP71flqPNTTz3ByJF3MnXqFJo3b8Gee+5F377n0KRJE8rKyhg+fBjjxj3HzJnT6dhxY0499Uy6\ndNm1yuOeeeYpdO68AzNnzuT558dSUFDA7373f/TpcwZAtf3Nnj2Lyy+/lLfeeoP11luPP/7xfC6+\n+AIuuugSunXrzpw5c/jrX//C66+/xvfff8+mm25Gv37nstVWW3PXXSO4447hAOy1167861+PMnz4\nMGbPnsUZZ5zN0Ucfyt13389mm21eWW+/fqey0Uad6N//Qr766n8MHXoDH3/8AeXl5ey00y6cc875\ntGmzTm3/9dQ6L9KTJElagSlTpnDZZX/m+ONPYuzYFxg69BaeeGIUTz45epl9p02bylVXDeSss/oz\nduwEhg+/i3feeZvRox8FYPjwYbz++qvceOMwnn56PIceejh/+lN/pk8vXu7xH330ITp33oGXXnqJ\ns87qz8iRd/LZZ5/WqL/Bgy+npGQGDz74GH/7263885/38P338yv7HjZsKJMmfce99z7EmDHP8qtf\nbcUll1wAwAknnEyPHgfQpcuuPPfcRIqK2lU+b+ONO7HFFr9g/PjnKreVlMzknXfeYt9992PBggX8\n8Y9nsPnmW/Dww0/wr389xoIFCxg8+IrV+JvIHQOyJEnSCrRv357Ro8ey117dgSQc/upXW/LRRx8u\ns++8efOoqKigefMWFBQU0L59B+6885/06nUYFRUVjB79CMcccyLrr78BhYWFHHjgwXTqtCnPPPPU\nco+/6aabsdde3WnSpAndu/egcePGfPXVl9X2V1FRwauvvsyhhx7Juuu2pW3bIo4//v+RyWQq+z7n\nnPO54YabWGuttWjSpAl7770P06ZNZcaM6dW+L3vvvS/jxz9f+f348c/Trt16bLPNdrzyykvMnTuX\n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\n",
            "text/plain": [
              "<Figure size 720x432 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "FBVTk9aujCuI",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "b6da78e5-7d93-4751-9edf-6d10d579dc33"
      },
      "cell_type": "code",
      "source": [
        "estimated_correct_labels"
      ],
      "execution_count": 95,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([510626,   5006,  16681,   8818])"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 95
        }
      ]
    },
    {
      "metadata": {
        "id": "UphioXJOjSpn",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "796c832c-a5b1-4738-8f87-2911799c0e30"
      },
      "cell_type": "code",
      "source": [
        "estimated_labels"
      ],
      "execution_count": 96,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([524979,   5296,  17825,  27543])"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 96
        }
      ]
    },
    {
      "metadata": {
        "id": "_XrjAwLzjbWf",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "fd606ff9-7ca8-48c3-8c97-0a42273bca68"
      },
      "cell_type": "code",
      "source": [
        "true_labels"
      ],
      "execution_count": 97,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([530785,   8097,  16682,  20079])"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 97
        }
      ]
    },
    {
      "metadata": {
        "id": "Jw9xTn9EkMku",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "45e07295-9d38-4b52-ef94-b6aeafe6c62d"
      },
      "cell_type": "code",
      "source": [
        "np.abs(estimated_correct_labels-true_labels) # false negative"
      ],
      "execution_count": 98,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([20159,  3091,     1, 11261])"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 98
        }
      ]
    },
    {
      "metadata": {
        "id": "OSneeTpxkYiU",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "cc6ab49b-aab8-47d7-d0c7-7345bd999534"
      },
      "cell_type": "code",
      "source": [
        "np.abs(estimated_labels-estimated_correct_labels)  #false positive"
      ],
      "execution_count": 99,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([14353,   290,  1144, 18725])"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 99
        }
      ]
    },
    {
      "metadata": {
        "id": "O0Z8IHZhonlP",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 482
        },
        "outputId": "6a9563e9-51d1-4a3b-dc66-a1bad26c1c94"
      },
      "cell_type": "code",
      "source": [
        "aggregated_data_test = np.array(maped)\n",
        "\n",
        "print('Performance measures on Test data')\n",
        "print('Accuracy =  {:.4f}'.format(accuracy_score( aggregated_data_test,actions)))\n",
        "print('F1 =  {:.4f}'.format(f1_score(aggregated_data_test,actions, average='weighted')))\n",
        "print('Precision_score =  {:.4f}'.format(precision_score(aggregated_data_test,actions, average='weighted')))\n",
        "print('recall_score =  {:.4f}'.format(recall_score(aggregated_data_test,actions, average='weighted')))\n",
        "\n",
        "cnf_matrix = confusion_matrix(aggregated_data_test,actions)\n",
        "np.set_printoptions(precision=2)\n",
        "plt.figure()\n",
        "plt.figure()\n",
        "plot_confusion_matrix(cnf_matrix, classes=env.attack_types, normalize=True,\n",
        "                      title='AE-RL')\n",
        "plt.tight_layout()\n",
        "plt.savefig('results/confusion_matrix_adversarial.tif', format='tif', dpi=100)"
      ],
      "execution_count": 100,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Performance measures on Test data\n",
            "Accuracy =  0.9400\n",
            "F1 =  0.9434\n",
            "Precision_score =  0.9484\n",
            "recall_score =  0.9400\n",
            "Normalized confusion matrix\n",
            "[[9.62e-01 5.46e-04 2.16e-03 3.53e-02]\n",
            " [3.82e-01 6.18e-01 0.00e+00 0.00e+00]\n",
            " [5.99e-05 0.00e+00 1.00e+00 0.00e+00]\n",
            " [5.61e-01 0.00e+00 0.00e+00 4.39e-01]]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nSUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "hVn1_CP5AQtN",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 202
        },
        "outputId": "db29d8bf-06c0-4bc4-f849-6f5409fb1b7f"
      },
      "cell_type": "code",
      "source": [
        "print(classification_report(aggregated_data_test,actions,target_names=['normal', 'flooding', 'injection', 'impersonation']))"
      ],
      "execution_count": 101,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "               precision    recall  f1-score   support\n",
            "\n",
            "       normal       0.97      0.96      0.97    530785\n",
            "     flooding       0.95      0.62      0.75      8097\n",
            "    injection       0.94      1.00      0.97     16682\n",
            "impersonation       0.32      0.44      0.37     20079\n",
            "\n",
            "    micro avg       0.94      0.94      0.94    575643\n",
            "    macro avg       0.79      0.75      0.76    575643\n",
            " weighted avg       0.95      0.94      0.94    575643\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "60L3BNptopsZ",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 134
        },
        "outputId": "3208c89a-c9c3-44da-844b-c4e4a2244334"
      },
      "cell_type": "code",
      "source": [
        "#['normal', 'flooding', 'injection', 'impersonation']\n",
        "mapa = {0:'normal', 1:'flooding', 2:'injection',3:'impersonation'}\n",
        "yt_app = pd.Series(maped).map(mapa)\n",
        "\n",
        "perf_per_class = pd.DataFrame(index=range(len(yt_app.unique())),columns=['name', 'acc','f1', 'pre','rec'])\n",
        "for i,x in enumerate(pd.Series(yt_app).value_counts().index):\n",
        "    y_test_hat_check = pd.Series(actions).map(mapa).copy()\n",
        "    y_test_hat_check[y_test_hat_check != x] = 'OTHER'\n",
        "    yt_app = pd.Series(maped).map(mapa).copy()\n",
        "    yt_app[yt_app != x] = 'OTHER'\n",
        "    ac=accuracy_score( yt_app,y_test_hat_check)\n",
        "    f1=f1_score( yt_app,y_test_hat_check,pos_label=x, average='binary')\n",
        "    pr=precision_score( yt_app,y_test_hat_check,pos_label=x, average='binary')\n",
        "    re=recall_score( yt_app,y_test_hat_check,pos_label=x, average='binary')\n",
        "    perf_per_class.iloc[i]=[x,ac,f1,pr,re]\n",
        "    \n",
        "print(\"\\r\\nOne vs All metrics: \\r\\n{}\".format(perf_per_class))\n"
      ],
      "execution_count": 102,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\r\n",
            "One vs All metrics: \r\n",
            "            name       acc        f1       pre       rec\n",
            "0         normal  0.940046  0.967311   0.97266   0.96202\n",
            "1  impersonation  0.947909  0.370333  0.320154  0.439165\n",
            "2      injection  0.998011  0.966818   0.93582   0.99994\n",
            "3       flooding  0.994127  0.747555  0.945242  0.618254\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "P89yhncYZ2b3",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Keras MLP"
      ]
    },
    {
      "metadata": {
        "id": "8_q43FU0hC44",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "import keras\n",
        "from keras.models import Sequential"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "9mGfiCMaAfqw",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "y = train['labels']\n",
        "x = train.drop(['labels'],axis=1)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "eZKJF_HSBsDx",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 50
        },
        "outputId": "960b39cf-8450-4ad6-83f0-7730907a192a"
      },
      "cell_type": "code",
      "source": [
        "print(x.shape)\n",
        "print(y.shape)"
      ],
      "execution_count": 45,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(1795575, 46)\n",
            "(1795575,)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "jwUtLgxrB-5i",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "y = pd.get_dummies(y)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "03YTiDfWA85o",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 50
        },
        "outputId": "d9f60b0b-0a04-434b-9a88-4f0479f79299"
      },
      "cell_type": "code",
      "source": [
        "print(x.shape)\n",
        "print(y.shape)"
      ],
      "execution_count": 47,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(1795575, 46)\n",
            "(1795575, 4)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "pQ-5Xw3NFCcy",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "keras.backend.clear_session()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "AYAkgsoMCN9K",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 235
        },
        "outputId": "a4650719-29cf-4434-d60f-b7a2738c00af"
      },
      "cell_type": "code",
      "source": [
        "model = Sequential()\n",
        "model.add(Dense(100,input_shape=(x.shape[1],) ))\n",
        "model.add(Dense(100))\n",
        "model.add(Dense(y.shape[1]))\n",
        "model.summary()"
      ],
      "execution_count": 49,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense_1 (Dense)              (None, 100)               4700      \n",
            "_________________________________________________________________\n",
            "dense_2 (Dense)              (None, 100)               10100     \n",
            "_________________________________________________________________\n",
            "dense_3 (Dense)              (None, 4)                 404       \n",
            "=================================================================\n",
            "Total params: 15,204\n",
            "Trainable params: 15,204\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "jwAivdIPCKTr",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "model.compile(optimizer='adam',loss='mse',metrics=['acc'])"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "AGmdrxd_CKWO",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 101
        },
        "outputId": "ac888f1e-56ab-48d5-a7dd-f9c44f4ccbd0"
      },
      "cell_type": "code",
      "source": [
        "model.fit(x=x,y=y,epochs=2,shuffle=True)"
      ],
      "execution_count": 51,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/2\n",
            "1795575/1795575 [==============================] - 217s 121us/step - loss: 0.0172 - acc: 0.9701\n",
            "Epoch 2/2\n",
            "1795575/1795575 [==============================] - 217s 121us/step - loss: 0.0169 - acc: 0.9701\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<keras.callbacks.History at 0x7fed444f4d68>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 51
        }
      ]
    },
    {
      "metadata": {
        "id": "3Qg2-CxnCKYb",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "y_test = test['labels']\n",
        "x_test = test.drop(['labels'],axis=1)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "xcLte5bMYfte",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "from sklearn.preprocessing import LabelEncoder"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "1UTk-XbgZPal",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "le = LabelEncoder()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "RrDuqJK7ZRi_",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "y_test_e = le.fit_transform(y_test)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "xieVctcdETi2",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "preds = model.predict(x=x_test)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "3cgcBM6h4CP-",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Results really overfitted"
      ]
    },
    {
      "metadata": {
        "id": "mOPHm1bpEnnI",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 202
        },
        "outputId": "728c1152-a1f5-46a0-a027-ee4fb7f1871b"
      },
      "cell_type": "code",
      "source": [
        "print(classification_report(y_test_e,np.argmax(preds,axis=-1),target_names=le.classes_))"
      ],
      "execution_count": 57,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "               precision    recall  f1-score   support\n",
            "\n",
            "     flooding       0.99      0.04      0.08      8097\n",
            "impersonation       0.00      0.00      0.00     20079\n",
            "    injection       0.92      1.00      0.96     16682\n",
            "       normal       0.95      0.99      0.97    530785\n",
            "\n",
            "    micro avg       0.95      0.95      0.95    575643\n",
            "    macro avg       0.72      0.51      0.50    575643\n",
            " weighted avg       0.92      0.95      0.93    575643\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "O35CUVO0ETeY",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 101
        },
        "outputId": "988492b5-6341-478b-a98c-67a78a3a1418"
      },
      "cell_type": "code",
      "source": [
        "print('Performance measures on Test data')\n",
        "print('Accuracy =  {:.4f}'.format(accuracy_score(y_test_e,np.argmax(preds,axis=-1))))\n",
        "print('F1 =  {:.4f}'.format(f1_score(y_test_e,np.argmax(preds,axis=-1), average='weighted')))\n",
        "print('Precision_score =  {:.4f}'.format(precision_score(y_test_e,np.argmax(preds,axis=-1), average='weighted')))\n",
        "print('recall_score =  {:.4f}'.format(recall_score(y_test_e,np.argmax(preds,axis=-1), average='weighted')))"
      ],
      "execution_count": 58,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Performance measures on Test data\n",
            "Accuracy =  0.9466\n",
            "F1 =  0.9250\n",
            "Precision_score =  0.9169\n",
            "recall_score =  0.9466\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "32ae17RjfTnq",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "4a5beca2-766d-4816-90fa-326b32a4e5f9"
      },
      "cell_type": "code",
      "source": [
        "le.classes_"
      ],
      "execution_count": 59,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array(['flooding', 'impersonation', 'injection', 'normal'], dtype=object)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 59
        }
      ]
    },
    {
      "metadata": {
        "id": "1SblH6mtv8ts",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 381
        },
        "outputId": "75077aa0-79f1-4ef2-f949-72403f9e44b6"
      },
      "cell_type": "code",
      "source": [
        "order = ['normal', 'flooding', 'injection', 'impersonation']\n",
        "permute_dict = {0:1,1:3,2:2,3:0}\n",
        "\n",
        "\n",
        "y_test_e_permuted = np.vectorize(permute_dict.get)(y_test_e)\n",
        "predictions_permuted = np.vectorize(permute_dict.get)(np.argmax(preds,axis=-1))\n",
        "\n",
        "cnf_matrix = confusion_matrix(y_test_e_permuted,predictions_permuted)\n",
        "np.set_printoptions(precision=2)\n",
        "plt.figure()\n",
        "plot_confusion_matrix(cnf_matrix, classes=order, normalize=True,\n",
        "                      title='MLP Results')\n",
        "plt.tight_layout()\n",
        "plt.savefig('results/confusion_matrix_keras.tif', format='tif', dpi=100)"
      ],
      "execution_count": 60,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Normalized confusion matrix\n",
            "[[9.95e-01 3.77e-06 2.78e-03 2.62e-03]\n",
            " [9.40e-01 4.00e-02 0.00e+00 2.04e-02]\n",
            " [5.99e-05 0.00e+00 1.00e+00 0.00e+00]\n",
            " [1.00e+00 0.00e+00 0.00e+00 3.49e-04]]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nBJYcjTEmgv8H9S9i2j8uitsAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "Pb8qsGN64O8p",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Results with random batches"
      ]
    },
    {
      "metadata": {
        "id": "MRhmq07u36Ag",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "keras.backend.clear_session()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "3usty8c7ETao",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 235
        },
        "outputId": "f62aec30-3732-472d-f5d2-11b94479f901"
      },
      "cell_type": "code",
      "source": [
        "model = Sequential()\n",
        "model.add(Dense(100,input_shape=(x.shape[1],) ))\n",
        "model.add(Dense(100))\n",
        "model.add(Dense(y.shape[1]))\n",
        "model.summary()"
      ],
      "execution_count": 62,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense_1 (Dense)              (None, 100)               4700      \n",
            "_________________________________________________________________\n",
            "dense_2 (Dense)              (None, 100)               10100     \n",
            "_________________________________________________________________\n",
            "dense_3 (Dense)              (None, 4)                 404       \n",
            "=================================================================\n",
            "Total params: 15,204\n",
            "Trainable params: 15,204\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "A1Fr1k2D4NFI",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "model.compile(optimizer='adam',loss='mse',metrics=['acc'])"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "jGqfAVcR4m-v",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 202
        },
        "outputId": "e2505195-b86d-42df-c636-6c2901e0fd18"
      },
      "cell_type": "code",
      "source": [
        "model.fit(x=x,y=y,steps_per_epoch=100,epochs=5,shuffle=True)"
      ],
      "execution_count": 64,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/5\n",
            "100/100 [==============================] - 93s 928ms/step - loss: 0.0784 - acc: 0.9043\n",
            "Epoch 2/5\n",
            "100/100 [==============================] - 92s 922ms/step - loss: 0.0179 - acc: 0.9708\n",
            "Epoch 3/5\n",
            "100/100 [==============================] - 92s 925ms/step - loss: 0.0168 - acc: 0.9702\n",
            "Epoch 4/5\n",
            "100/100 [==============================] - 93s 927ms/step - loss: 0.0168 - acc: 0.9702\n",
            "Epoch 5/5\n",
            "100/100 [==============================] - 92s 923ms/step - loss: 0.0168 - acc: 0.9702\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<keras.callbacks.History at 0x7fed447026d8>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 64
        }
      ]
    },
    {
      "metadata": {
        "id": "-JD_6eSE5MLp",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "preds = model.predict(x=x_test)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "1gKzuojz4n-y",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 202
        },
        "outputId": "936d4d9b-133c-47a0-aa90-799272f7b64f"
      },
      "cell_type": "code",
      "source": [
        "print(classification_report(y_test_e,np.argmax(preds,axis=-1),target_names=le.classes_))"
      ],
      "execution_count": 66,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "               precision    recall  f1-score   support\n",
            "\n",
            "     flooding       0.99      0.04      0.08      8097\n",
            "impersonation       0.09      0.00      0.00     20079\n",
            "    injection       0.92      1.00      0.96     16682\n",
            "       normal       0.95      1.00      0.97    530785\n",
            "\n",
            "    micro avg       0.95      0.95      0.95    575643\n",
            "    macro avg       0.74      0.51      0.50    575643\n",
            " weighted avg       0.92      0.95      0.93    575643\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "LhKonA2L4n7-",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 101
        },
        "outputId": "aac277a3-594e-4aa3-f9f8-54f09ebef29d"
      },
      "cell_type": "code",
      "source": [
        "print('Performance measures on Test data')\n",
        "print('Accuracy =  {:.4f}'.format(accuracy_score(y_test_e,np.argmax(preds,axis=-1))))\n",
        "print('F1 =  {:.4f}'.format(f1_score(y_test_e,np.argmax(preds,axis=-1), average='weighted')))\n",
        "print('Precision_score =  {:.4f}'.format(precision_score(y_test_e,np.argmax(preds,axis=-1), average='weighted')))\n",
        "print('recall_score =  {:.4f}'.format(recall_score(y_test_e,np.argmax(preds,axis=-1), average='weighted')))"
      ],
      "execution_count": 67,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Performance measures on Test data\n",
            "Accuracy =  0.9488\n",
            "F1 =  0.9259\n",
            "Precision_score =  0.9195\n",
            "recall_score =  0.9488\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "HHMTgnDu4n5n",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 381
        },
        "outputId": "31c07ce9-6905-4b68-9c49-a631cbbe19e8"
      },
      "cell_type": "code",
      "source": [
        "order = ['normal', 'flooding', 'injection', 'impersonation']\n",
        "permute_dict = {0:1,1:3,2:2,3:0}\n",
        "\n",
        "\n",
        "y_test_e_permuted = np.vectorize(permute_dict.get)(y_test_e)\n",
        "predictions_permuted = np.vectorize(permute_dict.get)(np.argmax(preds,axis=-1))\n",
        "\n",
        "cnf_matrix = confusion_matrix(y_test_e_permuted,predictions_permuted)\n",
        "np.set_printoptions(precision=2)\n",
        "plt.figure()\n",
        "plot_confusion_matrix(cnf_matrix, classes=le.classes_, normalize=True,\n",
        "                      title='MLP Results')\n",
        "plt.tight_layout()\n",
        "plt.savefig('results/confusion_matrix_keras2.tif', format='tif', dpi=100)"
      ],
      "execution_count": 68,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Normalized confusion matrix\n",
            "[[9.97e-01 3.77e-06 2.88e-03 1.39e-04]\n",
            " [9.60e-01 4.00e-02 0.00e+00 0.00e+00]\n",
            " [5.99e-05 0.00e+00 1.00e+00 0.00e+00]\n",
            " [1.00e+00 0.00e+00 0.00e+00 3.49e-04]]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n/h/XeEnhJcWe+AAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 432x288 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "Lf0sZoGtwJij",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### SMOTE"
      ]
    },
    {
      "metadata": {
        "id": "GGkLioZb5V2Y",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "import gc"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "fkD5JiJn2rtL",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "from imblearn.over_sampling import SMOTE\n",
        "from imblearn.under_sampling  import ClusterCentroids"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "4hX1orkXqWsq",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 50
        },
        "outputId": "20307f46-f79a-4288-cacc-69fdc4964019"
      },
      "cell_type": "code",
      "source": [
        "print(x.values.shape)\n",
        "print(y.values.shape)"
      ],
      "execution_count": 71,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(1795575, 46)\n",
            "(1795575, 4)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "Bebq5ryd36Ph",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "X_resampled, y_resampled = SMOTE().fit_resample(x.values, y.values)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "LgQE-igV4vED",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "indices = np.random.randint(0,y_resampled.shape[0],1000000)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "OORAiqI-3pmw",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "sub_X = X_resampled[indices]\n",
        "sub_y = y_resampled[indices]"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "sw-0CkqP4RES",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "a86f8842-662c-4657-c782-ceec6c52eecc"
      },
      "cell_type": "code",
      "source": [
        "sub_y.sum(axis=0)"
      ],
      "execution_count": 75,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([250113, 250094, 250311, 249482])"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 75
        }
      ]
    },
    {
      "metadata": {
        "id": "dyaQnAkF36NI",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "keras.backend.clear_session()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "5IpkJNHfumur",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "6a464e6e-fc78-4164-d7a3-88d2941365e1"
      },
      "cell_type": "code",
      "source": [
        "gc.collect()"
      ],
      "execution_count": 77,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "0"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 77
        }
      ]
    },
    {
      "metadata": {
        "id": "WEmrPc73xf2F",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "84af803e-5632-453d-cb43-945a47074aaa"
      },
      "cell_type": "code",
      "source": [
        "y_resampled.shape"
      ],
      "execution_count": 78,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(6532760, 4)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 78
        }
      ]
    },
    {
      "metadata": {
        "id": "IeeG-QVR36KN",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 235
        },
        "outputId": "7ef2bfca-8bb6-4da5-a959-51e60eb5d7f9"
      },
      "cell_type": "code",
      "source": [
        "model = Sequential()\n",
        "model.add(Dense(100,input_shape=(sub_X.shape[1],) ))\n",
        "model.add(Dense(100))\n",
        "model.add(Dense(sub_y.shape[1]))\n",
        "model.summary()"
      ],
      "execution_count": 79,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense_1 (Dense)              (None, 100)               4700      \n",
            "_________________________________________________________________\n",
            "dense_2 (Dense)              (None, 100)               10100     \n",
            "_________________________________________________________________\n",
            "dense_3 (Dense)              (None, 4)                 404       \n",
            "=================================================================\n",
            "Total params: 15,204\n",
            "Trainable params: 15,204\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "Kyi07IbS36FA",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 706
        },
        "outputId": "e1c8e185-b7b9-4cb1-ecb9-9dc9aa3cbce0"
      },
      "cell_type": "code",
      "source": [
        "model.compile(optimizer='adam',loss=huber_loss,metrics=['acc'])\n",
        "model.fit(x=sub_X,y=sub_y,steps_per_epoch=100,epochs=20,shuffle=True)"
      ],
      "execution_count": 80,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0285 - acc: 0.8910\n",
            "Epoch 2/20\n",
            "100/100 [==============================] - 30s 298ms/step - loss: 0.0106 - acc: 0.9493\n",
            "Epoch 3/20\n",
            "100/100 [==============================] - 30s 298ms/step - loss: 0.0105 - acc: 0.9513\n",
            "Epoch 4/20\n",
            "100/100 [==============================] - 30s 298ms/step - loss: 0.0105 - acc: 0.9524\n",
            "Epoch 5/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0105 - acc: 0.9532\n",
            "Epoch 6/20\n",
            "100/100 [==============================] - 30s 299ms/step - loss: 0.0105 - acc: 0.9534\n",
            "Epoch 7/20\n",
            "100/100 [==============================] - 30s 299ms/step - loss: 0.0105 - acc: 0.9533\n",
            "Epoch 8/20\n",
            "100/100 [==============================] - 30s 300ms/step - loss: 0.0105 - acc: 0.9531\n",
            "Epoch 9/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0105 - acc: 0.9530\n",
            "Epoch 10/20\n",
            "100/100 [==============================] - 30s 299ms/step - loss: 0.0104 - acc: 0.9529\n",
            "Epoch 11/20\n",
            "100/100 [==============================] - 30s 302ms/step - loss: 0.0104 - acc: 0.9528\n",
            "Epoch 12/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0104 - acc: 0.9527\n",
            "Epoch 13/20\n",
            "100/100 [==============================] - 30s 298ms/step - loss: 0.0104 - acc: 0.9527\n",
            "Epoch 14/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0105 - acc: 0.9537\n",
            "Epoch 15/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0104 - acc: 0.9525\n",
            "Epoch 16/20\n",
            "100/100 [==============================] - 30s 302ms/step - loss: 0.0105 - acc: 0.9534\n",
            "Epoch 17/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0104 - acc: 0.9529\n",
            "Epoch 18/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0104 - acc: 0.9524\n",
            "Epoch 19/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0105 - acc: 0.9535\n",
            "Epoch 20/20\n",
            "100/100 [==============================] - 30s 301ms/step - loss: 0.0105 - acc: 0.9535\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<keras.callbacks.History at 0x7fed4381e358>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 80
        }
      ]
    },
    {
      "metadata": {
        "id": "8EL0cH1vvg9j",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "VaMpY1eavg7P",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "preds = model.predict(x=x_test)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "svf56Pkyvg4q",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 202
        },
        "outputId": "d87ddc74-009f-423b-b627-08c8a443cc98"
      },
      "cell_type": "code",
      "source": [
        "print(classification_report(y_test_e,np.argmax(preds,axis=-1),target_names=le.classes_))"
      ],
      "execution_count": 82,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "               precision    recall  f1-score   support\n",
            "\n",
            "     flooding       0.60      0.62      0.61      8097\n",
            "impersonation       0.34      0.93      0.50     20079\n",
            "    injection       0.41      1.00      0.58     16682\n",
            "       normal       0.99      0.88      0.93    530785\n",
            "\n",
            "    micro avg       0.88      0.88      0.88    575643\n",
            "    macro avg       0.58      0.86      0.65    575643\n",
            " weighted avg       0.95      0.88      0.90    575643\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "vAfWOv4nvg2U",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 101
        },
        "outputId": "6ddc9640-286c-458e-ea9c-096a06f8fd6c"
      },
      "cell_type": "code",
      "source": [
        "print('Performance measures on Test data')\n",
        "print('Accuracy =  {:.4f}'.format(accuracy_score(y_test_e,np.argmax(preds,axis=-1))))\n",
        "print('F1 =  {:.4f}'.format(f1_score(y_test_e,np.argmax(preds,axis=-1), average='weighted')))\n",
        "print('Precision_score =  {:.4f}'.format(precision_score(y_test_e,np.argmax(preds,axis=-1), average='weighted')))\n",
        "print('recall_score =  {:.4f}'.format(recall_score(y_test_e,np.argmax(preds,axis=-1), average='weighted')))"
      ],
      "execution_count": 83,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Performance measures on Test data\n",
            "Accuracy =  0.8813\n",
            "F1 =  0.9020\n",
            "Precision_score =  0.9455\n",
            "recall_score =  0.8813\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "OMht0Ud8vgz4",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 381
        },
        "outputId": "49a34fa9-351b-43ea-8e2d-97f1d064ccc7"
      },
      "cell_type": "code",
      "source": [
        "order = ['normal', 'flooding', 'injection', 'impersonation']\n",
        "permute_dict = {0:1,1:3,2:2,3:0}\n",
        "\n",
        "\n",
        "y_test_e_permuted = np.vectorize(permute_dict.get)(y_test_e)\n",
        "predictions_permuted = np.vectorize(permute_dict.get)(np.argmax(preds,axis=-1))\n",
        "\n",
        "cnf_matrix = confusion_matrix(y_test_e_permuted,predictions_permuted)\n",
        "np.set_printoptions(precision=2)\n",
        "plt.figure()\n",
        "plot_confusion_matrix(cnf_matrix, classes=le.classes_, normalize=True,\n",
        "                      title='Over Sampling')\n",
        "plt.tight_layout()\n",
        "plt.savefig('results/confusion_matrix_keras_OverSampl.tif', format='tif', dpi=100)"
      ],
      "execution_count": 84,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Normalized confusion matrix\n",
            "[[8.80e-01 6.04e-03 4.59e-02 6.82e-02]\n",
            " [3.82e-01 6.18e-01 0.00e+00 0.00e+00]\n",
            " [5.99e-05 0.00e+00 1.00e+00 0.00e+00]\n",
            " [6.52e-02 8.22e-03 0.00e+00 9.27e-01]]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "ZtSVYZjsmfM-",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Data distribution"
      ]
    },
    {
      "metadata": {
        "id": "2k3OXg5J4NCp",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 585
        },
        "outputId": "d1ceb129-f878-4f10-bc03-ce66ece41198"
      },
      "cell_type": "code",
      "source": [
        "train['labels'].groupby(train['labels']).count().plot(kind=\"bar\",figsize=[10,8],rot=33,title=\"Train set\")\n",
        "plt.tight_layout()\n",
        "plt.savefig('results/train_distributio.tif', format='tif', dpi=100)"
      ],
      "execution_count": 85,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\neb7zgZubNmY165bPAi6LiFuAJcDhw/PyJUmSpCfr6OnpaXcf1onu7mVj84WtR66100jhWNRI4Vjc\nMMw9bX67uzAmzJozs91dGFRX18R+97Z5JT1JkiSpYkCWJEmSKgZkSZIkqWJAliRJkioGZEmSJKli\nQJYkSZIqBmRJkiSpYkCWJEmSKgZkSZIkqWJAliRJkioGZEmSJKliQJYkSZIqBmRJkiSpYkCWJEmS\nKgZkSZIkqWJAliRJkioGZEmSJKliQJYkSZIqBmRJkiSpYkCWJEmSKgZkSZIkqWJAliRJkioGZEmS\nJKliQJYkSZIqBmRJkiSpYkCWJEmSKgZkSZIkqWJAliRJkioGZEmSJKliQJYkSZIqBmRJkiSpYkCW\nJEmSKgZkSZIkqWJAliRJkioGZEmSJKliQJYkSZIqBmRJkiSpYkCWJEmSKgZkSZIkqWJAliRJkioG\nZEmSJKliQJYkSZIqBmRJkiSpYkCWJEmSKgZkSZIkqWJAliRJkiqdrTwoIjYDLgEmA08DTgZ+D8wF\neoDbM3NWU/cE4OCm/OTMvCYiJgGXA5OAh4FDM/OhiNgd+ASwErgmM/+5aeMM4JVNG8dl5sIWX68k\nSZI0oFZnkI8AMjN3BQ4CPgecSQmv04FJEbFXREwFDgFmAPsCp0fEOGA2MD8zZwDfAj7QtHsWcCAw\nHXhdROwQEa8BnpeZrwKObupIkiRJ60SrAfmPwJbN7cnAQ8DUamb3amB3YFfg2sx8LDO7gfuAHYDd\ngCvruhHxXOChzPxtZq4Crmnq7QZ8GyAz7wQmR8QzWuy3JEmSNKCWllhk5tci4oiIuIcSkPcDzqmq\nPABsBTwIdPdTPqUq76+st3x74JnAj6vy7qbunwbq4+TJE+jsHLdmL0xP0dU1sd1dkADHokYOx6I0\nNKP5vdLqGuTDgf/OzNdHxI6U2eClVZWO1Ty0v/I1qTtQ+ZMsXvzIUKppAF1dE+nuXtbubkiORY0Y\njkVp6EbDe2V1Ib7VJRbTgesBMvOnwCaUmd5e2wCLmn9TBilfk7oAWwP3t9hvSZIkaUCtBuR7gJ0B\nImJbYBlwZ0TMaH5+AHAdcCOwT0SMj4itKaH3DuAGyskWUDblXZeZvwGeERHbRUQnZVPfDc2/g5rn\nehmwKDNH/p8kkiRJGpVaWmIBnAtcGBHfb9p4J+WYt3MjYiNgQWbOA4iI84GbKUe0zcrMVRFxFnBZ\nRNwCLAEOb9qdBXy1uX1FZt4N3B0RP46IHwCrgHe12GdJkiRpUB09PT3t7sM60d29bGy+sPXItXYa\nKRyLGikcixuGuafNb3cXxoRZc2a2uwuD6uqa2O/eNq+kJ0mSJFUMyJIkSVLFgCxJkiRVDMiSJElS\nxYAsSZIkVQzIkiRJUsWALEmSJFUMyJIkSVLFgCxJkiRVDMiSJElSxYAsSZIkVQzIkiRJUsWALEmS\nJFUMyJIkSVLFgCxJkiRVDMiSJElSxYAsSZIkVQzIkiRJUsWALEmSJFUMyJIkSVLFgCxJkiRVDMiS\nJElSxYAsSZIkVQzIkiRJUsWALEmSJFUMyJIkSVLFgCxJkiRVDMiSJElSxYAsSZIkVQzIkiRJUsWA\nLEmSJFUMyJIkSVLFgCxJkiRVDMiSJElSxYAsSZIkVQzIkiRJUsWALEmSJFUMyJIkSVLFgCxJkiRV\nDMiSJElSxYAsSZIkVQzIkiRJUsWALEmSJFUMyJIkSVLFgCxJkiRVDMiSJElSxYAsSZIkVTpbfWBE\nHAa8H3gcOAm4HbgUGAfcD7wlM5c39WYDq4DzMvOCiNgYuAjYFlgJHJmZ90bEjsBcoAe4PTNnNc91\nAnBwU35yZl7Tar8lSZKkgbQ0gxwRWwIfBWYA+wJvBD4GnJOZuwD3AEdFxKaU8Lw7MBM4PiK2AA4F\nlmTmDOAU4NSm6TOB4zJzOjApIvaKiKnAIdVznR4R41rptyRJkjSYVmeQdwfmZeYyYBnwDxHxa+Cd\nzc+vBt4HJLAwM5cCRMRtwHRgN+CSpu484MKIGA9MzcyFVRu7A1sB12bmY0B3RNwH7AD8rMW+S5Ik\nSavVakDeDpgQEd8BJgP/BGyamcubnz9ACbZTgO7qcU8pz8xVEdHTlC3up+6Dq2ljwIA8efIEOjud\naF5bXV0T290FCXAsauRwLEpDM5rfK60G5A5gS2B/yjrim5qy+uere9xQy9e0jSdZvPiRoVTTALq6\nJtLdvazd3ZAcixoxHIvS0I2G98rqQnyrp1j8AfhBZj6emb+iLLNYFhGbND/fBljU/JtSPe4p5c2G\nvQ7Kxr4tB6rbp1ySJEkadq0G5BuA10bERs2Gvc0oa4kPbH5+IHAdsACYFhGbR8RmlPXHtzSPP7ip\nux9wU2auAO6KiBlN+QFNGzcC+0TE+IjYmhKQ72ix35IkSdKAWlpikZm/i4hvAD9sit4DLAQuiYh3\nAPcBF2fmioiYA1zPE0e0LY2IK4A9IuJWYDlwRNPObODciNgIWJCZ8wAi4nzg5qaNWZm5qpV+S5Ik\nSYPp6OnpaXcf1onu7mVj84WtR66100jhWNRI4VjcMMw9bX67uzAmzJozs91dGFRX18R+97Z5JT1J\nkiSpYkCWJEmSKgZkSZIkqWJAliRJkioGZEmSJKliQJYkSZIqBmRJkiSpYkCWJEmSKgZkSZIkqWJA\nliRJkioGZEmSJKliQJYkSZIqBmRJkiSpYkCWJEmSKgZkSZIkqWJAliRJkioGZEmSJKliQJYkSZIq\nBmRJkiSpYkCWJEmSKgZkSZIkqWJAliRJkioGZEmSJKliQJYkSZIqBmRJkiSpYkCWJEmSKgZkSZIk\nqWJAliRJkioGZEmSJKliQJYkSZIqBmRJkiSpYkCWJEmSKgZkSZIkqWJAliRJkioGZEmSJKliQJYk\nSZIqBmRJkiSpYkCWJEmSKgZkSZIkqWJAliRJkioGZEmSJKliQJYkSZIqBmRJkiSpYkCWJEmSKgZk\nSZIkqWJAliRJkiqda/PgiNgE+Dnwz8D3gEuBccD9wFsyc3lEHAbMBlYB52XmBRGxMXARsC2wEjgy\nM++NiB2BuUAPcHtmzmqe5wTg4Kb85My8Zm36LUmSJK3O2s4gfwR4qLn9MeCczNwFuAc4KiI2BU4C\ndgdmAsdHxBbAocCSzJwBnAKc2rRxJnBcZk4HJkXEXhExFTgEmAHsC5weEePWst+SJElSv1oOyBHx\nAmAH4LtN0UzgO83tqymheGdgYWYuzcxHgduA6cBuwJVN3XnA9IgYD0zNzIV92tgVuDYzH8vMbuC+\n5nklSZKkYbc2Syw+C7wbeFtzf9PMXN7cfgDYCpgCdFePeUp5Zq6KiJ6mbHE/dR9cTRs/G6hzkydP\noLPTiea11dU1sd1dkADHokYOx6I0NKP5vdJSQI6ItwL/npm/joj+qnSs5qFrUr6mbTzJ4sWPDKWa\nBtDVNZHu7mXt7obkWNSI4ViUhm40vFdWF+JbXWKxD/DGiPghcAxwIvBws2kPYBtgUfNvSvW4p5Q3\nG/Y6KBv7thyobp9ySZIkadi1FJAz802ZOS0zXwl8iXKKxTzgwKbKgcB1wAJgWkRsHhGbUdYf3wLc\nQDmVAmA/4KbMXAHcFREzmvIDmjZuBPaJiPERsTUlIN/RSr8lSZKkwazVMW99fBS4JCLeQdlId3Fm\n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\n",
            "text/plain": [
              "<Figure size 720x576 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "XWM7YwB54M7q",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 585
        },
        "outputId": "370b7d8b-d898-4c53-9f12-cab3d0cc3f1d"
      },
      "cell_type": "code",
      "source": [
        "test['labels'].groupby(test['labels']).count().plot(kind=\"bar\",figsize=[10,8],rot=33,title=\"Test set\")\n",
        "plt.tight_layout()\n",
        "plt.savefig('results/test_distributio.tif', format='tif', dpi=100)"
      ],
      "execution_count": 86,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\ncmyS/5fkjVX12EwT6d7Q3ZdV1fFJ3pvvLtF2cVWdluSeVXV2kkuTPGIu97gkr6qqXZKc091nJElV\nvSbJh+cyju3uK7bRtQIAwBat2rBhw6LrcK2sW3fJyr6AZcL4OpYbbZLlRHvceZx84gcXXYUdwrHH\nr110FZZkzZq9r3K+m530AABgICADAMBAQAYAgIGADAAAAwEZAAAGAjIAAAwEZAAAGAjIAAAwEJAB\nAGAgIAMAwEBABgCAgYAMAAADARkAAAYCMgAADARkAAAYCMgAADAQkAEAYCAgAwDAQEAGAICBgAwA\nAAMBGQAABgIyAAAMBGQAABgIyAAAMBCQAQBgICADAMBAQAYAgIGADAAAAwEZAAAGAjIAAAwEZAAA\nGAjIAAAwEJABAGAgIAMAwEBABgCAgYAMAAADARkAAAYCMgAADARkAAAYCMgAADAQkAEAYCAgAwDA\nQEAGAICBgAwAAAMBGQAABgIyAAAMBGQAABgIyAAAMBCQAQBgICADAMBAQAYAgIGADAAAAwEZAAAG\nAjIAAAwEZAAAGAjIAAAwEJABAGAgIAMAwEBABgCAgYAMAAADARkAAAYCMgAADARkAAAYCMgAADAQ\nkAEAYCAgAwDAQEAGAICBgAwAAAMBGQAABgIyAAAMBGQAABgIyAAAMBCQAQBgICADAMBAQAYAgIGA\nDAAAAwEZAAAGq5dyUlXtnuRTSX4/yfuTnJpk1yRfS/Kw7r60qh6a5LgkVyR5dXe/rqquk+SUJDdN\ncnmSR3b3l6rqkCQnJ9mQ5J+6+9j55zw1yYPm48/q7ndtsysFAIAlWGoP8u8k+c/58bOTvKK775zk\nC0mOqao9kzwzyT2SrE3y5KraP8lDklzU3YcneW6SE+YyTkrypO4+LMk+VXVEVR2U5Ogkhye5b5IX\nV9Wu1/YCAQBga2wxIFfVTyQ5OMlfz4fWJnnH/PidmULxHZKc290Xd/e3knwkyWFJ7p7k9PncM5Ic\nVlW7JTmou8/dpIy7Jnl3d3+7u9cl+fL8cwEAYLtZyhCLFyV5YpJfm5/v2d2Xzo8vSHLDJAckWTe8\n5/uOd/cVVbVhPrb+Ks69cDNlfPLqKrfffntk9WodzdvCmjV7L7oK8D20SZYT7RGWbqV/Xq42IFfV\nw5N8tLv/uaqu6pRVm3nr1hzf2jK+x/r131zKaWzBmjV7Z926SxZdDbiSNslyoj3C1lkpn5fNBfkt\nDbE4Msn9q+rvkjw6yTOSfGOetJckByY5f/53wPC+7zs+T9hblWli3/Wv7txNjgMAwHZztQG5ux/c\n3Yd29x2TvDbTKhZnJDlqPuWoJO9Jck6SQ6tq36raK9P447OSvC/TqhRJcr8kH+juy5KcV1WHz8cf\nOJdxZpIjq2q3qrpRpoD8mW10nQAAsCRLWuZtE7+b5I1V9dhME+ne0N2XVdXxSd6b7y7RdnFVnZbk\nnlV1dpJLkzxiLuO4JK+qql2SnNPdZyRJVb0myYfnMo7t7iuuxbUBAMBWW7Vhw4ZF1+FaWbfukpV9\nAcuE8XUsN9oky4n2uPM4+cQPLroKO4Rjj1+76CosyZo1e1/lnDc76QEAwEBABgCAgYAMAAADARkA\nAAYCMgAADARkAAAYCMgAADAQkAEAYCAgAwDAQEAGAICBgAwAAAMBGQAABgIyAAAMBGQAABgIyAAA\nMBCQAQBgICADAMBAQAYAgIGADAAAAwEZAAAGAjIAAAwEZAAAGAjIAAAwEJABAGAgIAMAwEBABgCA\ngYAMAAADARkAAAYCMgAADARkAAAYCMgAADAQkAEAYCAgAwDAQEAGAICBgAwAAAMBGQAABgIyAAAM\nBGQAABgIyAAAMBCQAQBgICADAMBAQAYAgIGADAAAAwEZAAAGAjIAAAwEZAAAGAjIAAAwEJABAGAg\nIAMAwEBABgCAgYAMAAADARkAAAYCMgAADARkAAAYCMgAADAQkAEAYCAgAwDAQEAGAICBgAwAAAMB\nGQAABgIyAAAMBGQAABgIyAAAMBCQAQBgICADAMBAQAYAgIGADAAAAwEZAAAGAjIAAAwEZAAAGAjI\nAAAwEJABAGAgIAMAwEBABgCAgYAMAAADARkAAAart3RCVe2R5JQkN0hyvSS/n+QTSU5NsmuSryV5\nWHdfWlUPTXJckiuSvLq7X1dV15nff9Mklyd5ZHd/qaoOSXJykg1J/qm7j51/3lOTPGg+/qzufte2\nu1wAALh6S+lBvl+Sv+/un0/yy0lenOTZSV7R3XdO8oUkx1TVnkmemeQeSdYmeXJV7Z/kIUku6u7D\nkzw3yQlzuScleVJ3H5Zkn6o6oqoOSnJ0ksOT3DfJi6tq121zqQAAsGVb7EHu7tOGpzdJ8pVMAfhx\n87F3JnlKkk5ybndfnCRV9ZEkhyW5e5I3zueekeT1VbVbkoO6+9yhjHskuWGSd3f3t5Osq6ovJzk4\n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\nvj584B6d5LeTnJ3kTzN92G7b3Y+bX/94kg8mOaG71y2k0jCoqpt39xeH549K8pAkX03ygSSXJrlN\nkvd3999U1V2S/EWSg7Vhlqqq9u7uS+bHP5qpp3ifJOcleX2S45Jc0N3PqKobJ3l7kqd393sWVWd2\nHBt7jYff1U9J8sOZfk+vT3K/TBPznpHkaUk+nOQbSfZO8g/d/YEFVHtF0muyk5uHU+yb6Ut9t6ra\nv6oen+TQJHfOFCD+b6bhFavm15LkH5LcKsnNN5az3SsPs7kH+EFVdZP5+W2SPDBTb8pbMvWs3CbJ\nF5Lcvap+uLs/nGmYxQ21X5Zi/qPrF+bHuyZ5SZKPZeqpuzDTGPfnZ+qtO7S7v5LkDZludcO1UlW7\nznd4N1TV9avqEZl+D38t0/fcukxj3z/Q3eckOTPJnZIcleRPheOtowd5J1ZVuyU5N8ljuvtjVXV4\nkv9KcmyS/TJ96V+R5NmZekhemSlQ7JnkKUnukuSK7n72AqoPGyfe3aK7PzU/v0eS/0yyf5Jf7+5f\nrqrdM7XVu2dq74cl+ZfuPmlB1WaFme+w7dLd589zMn52vgvxqiTP6O4L5vP+Osmbk+yWaRLo7RdX\na3YUm04krqrfSPLQTJ2cD+7uz1XVqZkmH78pyV9nGgp5WJLndvcnFlDtFU8P8k6qqnbr7m8neUWS\nP5wPvyTJLTP1Gn8tyb3m9RRfk+TgTL0gD8o0+P8/khyexAePhenuS5M8pqqOm1cP+MlMKwicleTm\nVXW37v5Wks70R9/ZmX55vGNRdWZFunmSB1TVryT5xSRvrqq9M41rH9eZ/bNMPXhvzvR9euX4dncp\nuCbGpduq6oeq6vVJDkpyx0wT8F48n/rEJEck+aEkj0ty6yS/Kxxfc3qQd3LzzNbXJPm9TGOKX5Cp\nd/iITL3Gb+7u86rq6CTf7u6/rKqHz6+f0t3vXUjF2WldxRi838j0R9vju/uVVfW2TEscfT7JSUl+\nJsm9kzw+ya91978vpOKsKPPt7Mvnx7dI8qEkX+ruw6vq5UkuS/LaJH+S5MmZJuS9LNOt7LcsqNrs\noKrqeUk+leQOSe7Q3Xech/n8fZIXd/epVfXrSR7b3T+zyLruKATkncjGWddzj8aaTF/sH0rylUxf\n9DdN8sgkuyd5a5JfS3J+kpfPPXUby7nu+By2l01mbv9kpkkpP5Jpaa3Lu/uJVXVokj9KcmSSRyf5\nsUxt+8nd/ZmFVJwVq6oemCn83iHTaj4vyTTx8xOZvi9vmOT2meZsnNrdr1pQVdlBbPLH2W6Zlld9\nSHcfWlXXSfKeTJ1Xr62qX8j0+/snu/vieX7Ffyyu9jsOQyx2AsMOT1cMSxN9J8mGJCd39ylJfjfT\n0jDPTfKzmULFh5OcvUk4XiUdMMQVAAALwElEQVQcsyhDOP69JKdk6rlb293HJllbVQ/o7nMzrRzw\nxu5+XpIndve9u/szbnOzVFV1y6r6+0yrAjwxyRszrS/7yHl42nGZ2uB7u/u3k/zixnBs2UCujXk3\nxutV1S9l6rD6cpKvV9WR3X1Zpomgx1TVjebVUd6Z5Hbz72fheBvRg7wTmf/SPDbTGMwLkvxEpqXd\n/nh+/fxMQfkLmXYbO2HjOp+wKGNvyvz8npnW4X5MkudkmoD3m5nWOj4p052PJLl/pvF5l8x/HH5P\nObDRuKbxcOzIJLfq7hdW1QHd/e81bR/9zEydCedlGu9+Und/ZHPlwFJssq72LyR5eqa5Pv+c6Q7G\nJZnmCL24u78+D/O5cXc/YHNlcu0IyDuoTb+oq+qRmYLDS5McmGRtpolLFyX52+7+SFW9LtPybrcT\nJFi0TYZTXCfTmsanZ5psV5lWWVmd5KNJbtPdj66qF2baxeyZ3f22xdSclaqq7pPp7tonktwz023t\n+8y3uX8oyY0ydSw8OtMY999wR41rY5NgfL0k1810d+KM+ffyAzIN3/lypt7kb3X3S6vq+klu3d0f\nXFDVd3huA+2A5p6yjR+43ebDN0zyrO4+PdMyMGcnuUmmtTt/p6o+nGn73TsNY5+0DxZmCMe3TXJq\nptvcJyfZNVOvyn91968kOSfJrefNa96U5Oc2hmNDKticqrpbVd16Xgt+t/mPq8dlWiHgg5nWlb1Z\nVT1oHlJxs0zDdd6a5OjufkJ3X6qNcW0Mv6t/NVO7OynTd93G378fy7Sq1HcyheTbVVV194XC8Q+W\nALQDqaq9kivHLx0wLwfzvKr66Uz/r4+dT70oySeT/FuS05KckGktz5d393/XsFXvdr8Idmqb/lE2\nL932viQv7e5DM60ccESmCVM3qGnr1Ltk2szmad398e7+xjDu3i0yNue6ST47t5H9Mg3ReVCS/8n0\nR9iGTEHld6rqSZm+J8+b72z8Z/LdjRsWUnt2CFW1R1U9LtM67Y/KtFb79ZMcP7e1rya5PFNA/otM\nHV29sArvRAyx2AHMs/nvn2mDhFdnmrH/R5nGyX0j0wz/38q0MsXTuvst85CLw7r70ZuUtcoXPouw\nyZCKuyT53Dzu81NJ3tLdz6mqn8t3e5J/MdNQi8uS/Oq83jFs1lWMZ3/s/PAfM41pPyTTGtpPT3KL\nTD12N8m0VOCF3f1X27fG7Oiq6sBM25Xv0t0Pm4+dmWkY5PMz3SF7fJI/6e43LqqeOyMBeYWbdxI7\nI9Ng/o9k2lryv5K8rLvvM5/zO5n++jwnyVMz9SDvm+kv0XMWUW+4KjVte/68TBvTfDnTUIo3ZGq7\nt+ruC6vqtzPdBv+DJOvN2mZLqmrf7r5oeH6vTGvKHpLpD623Zdrw44LufuZ8zjOTfLCnLcnHskzE\nY5uqqrWZ5li8tbvPmO/6vitTh9fqTCulfGiBVdwpGWKxws0TRF6ZKVBUpr86D0zy6aq693zaCZl6\nR/4lyQOTvKS77yMcs0jz2M9Nv4OOTLJ7d69N8uuZJuLtn2k1ilPnc16UKTB/cWM4Nl6ezZnDxoPn\nxwdU1R9lWonizExDzS7M9N35sSS7VdWpVXVyps1l/nnT8oRjfgD+Nsmnk9xrXsf445nu+H62u58m\nHC+GHuQdQFU9PtMQis9l2kL3ikwzrq+XaVenz1fVmzKNM/7i8D7LXrFwVXXTJEdl2tHxQZkC8R92\n9//MmzQc3923r6qLMq1Be/oCq8sKU1V7dPc3517jpyc5vbtPqqoXZBqH/MpMY9jfkSkw3ynJPt39\n8oVVmp3O/D34v5Os6+7nL7o+6EHeUbwqyT0yLQFzcKaA/LUk65K8tKo+kOTTYzhOpsl827ui7Nzm\nXuNVw/PHZtqAYU2mJbQuyBRQbpIk3f2XmZbcSpI7juHY6gEsxRyOD8m0zOXBmdpXkjwtyW2T/Him\n29n3TrJnd79xYzjeOGEZftC6+8uZNuf6f4uuCxM9yDuQqnpipl8Cf5ZpzPEbktwg00YJ/7bIusGo\nqn4s06oBRyd5b6aeu32TXJzk2ZkWxf9UksOS7JNpS9/LN9kNEpakqlYnOSbTiic/m+Qp3f1X8zC0\nF2Yah/zIJN9M8oJMK1hYBYXtyiT55UVA3oHMy7ydnGkVi79K8hcbe4039rb58LG9bfqlX1UPz7Qh\nzTszberxM5mC8aWZltj6VJLPZAotn+3uk7Z7pdnhzKsFPCbTPI3vJHlAd19SVU9N8pJMw3uekeTQ\n7v7vhVUUWBYE5B1MVd0504SUZ3T3+kXXh53bVezouFumyVHnzTvf7Z5pUum/zZsu/K8k1+/u11XV\ndbr7svl9xstzrc3blP9ipu/I13X3bw+v/XySb3b3uYuqH7B8CMg7MLdrWC6q6vmZlhc8K9OShH+U\n5HHd/bmqunGSWya5Tabw8qruPm1j+9WO2VbmP9CenOQ6SV7f3edrX8BVEZB3UMZpsigb29689Nqa\nJC9P8g9J/ibT8mw3zLRqwC7zf/fItNHNXZI8r7u/b2kt2Faqaq/u/sb82PckcJWsYrGD8qXP9jaM\ncx8n0l2WaS3ZM5M8PNO4+P9I8vtJfirJr3T3f2VajvAx3f3P1jTmB2kIx6t8TwKbowcZuNY22Sb6\niCRPSfKmTLs63j3T0lov7O5Tq+rIJF9M8pPzv+dsDCp69ABYDgRk4BobA21V7ZFp97sDMi3b9hOZ\nNqzZI9MmNm/q7q9W1SuSvKW7z1pQtQHgarmVCVwj4y3qeUOFg5L8QaYtoP80yWlJ/jXT0m2XJ3lt\nVZ2RZM8k5w7l+B4CYFnRgwxslapa3d3fmR//cJKXZdrY47mZJtvdp7uPmEPzryT5sUybMfxUkl27\n+5z5vVYPAGBZEpCBJamqfbv7ouH5wUkekGmc8aVJHt3dt6+qv0tyWne/ZN7d8S7d/cublGWsMQDL\nloAMbFFV/XSmHcZeVVU3THJikptn6h3+ye6+uKrenuSjSd6W5P1J3phpSbfXd/eHF1NzANh6xv4B\nS3HeHI7vneStSc7t7sOTfCTJH87nPD7Jo+bHL0ty2+5+RHd/eOMScACwEgjIwBZ19zer6pBMaxnf\nKtOybUny6CQ/W1X37+6vJnl9kqcmeVGSQ6rqAfP73aoCYMUwxAJYkqpaneSYTDveHZrkN7r7r6vq\n6CQnJTmwuy8fzj8iyTcs5wbASiMgA0tWVQcmeUyStUm+k+QB3X1JVT0n01CLdd19+bjSBQCsNAIy\nsFWq6p5JfjHJg5O8truftuAqAcA2ZQwysLU+lOQrmSbibZygFxPxANhR6EEGtlpV7dXd35gfW9MY\ngB2KgAxcY3bDA2BHJCADAMDAGGQAABgIyAAAMBCQAQBgICADrABVtbaqzr6a10+pqkdvRXmPqKo/\n2Ta1A9ixCMgAADBYvegKALB0VXV4kucnuTTJHkke390fn1++fVX9UpIbJ/nj7n5RVe2W5BVJfjzJ\n3kne3N0v2qTME5PcbS7zq0l+rbsv3S4XBLAM6UEGWFl+OMmx3X23JC9NMm71faMkRyQ5PMnTqmr/\nJE9Kcn533zXJHZIcXVW32fiGqtovyROS3Km775zkL5PcYLtcCcAypQcZYGX59yQvrKrrJdknyfrh\ntTPmjVsuqqovJLlFkrsmuXFV/fx8zvUy9SYnSbp7fVW9N8mHqur0JKd191e2x4UALFd6kAFWllOT\nnNjdd0ny9E1eG7f8XpVkQ6ZhE8/u7rXzv1t391+Ob+ruX0qycYLfh6rqtj+gugOsCHqQAVaWGyT5\ndFXtmuRBSa47vHa3JC+bh03cLMnnkpyd5JeT/HlV7ZLkhUmes/ENVXWzJPfv7pckOa+qDkhySJJ/\n3B4XA7Ac6UEGWFmen+TMJO9MckqSm1TVcfNr51fV25KclanX+KJME/S+UVUfTfJ3SS7q7v8cyvtK\nkttV1ceq6v1JDkryF9vnUgCWp1UbNmxYdB0AAGDZ0IMMAAADARkAAAYCMgAADARkAAAYCMgAADAQ\nkAEAYCAgAwDA4P8DiR4xxKIC+aYAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 720x576 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "FGEi8G53mjjU",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Save figures for download"
      ]
    },
    {
      "metadata": {
        "id": "zBwYXT0AmrG8",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 185
        },
        "outputId": "f9b1256a-7e81-4c4b-92c1-ba86b0951528"
      },
      "cell_type": "code",
      "source": [
        "!zip results.zip results/*"
      ],
      "execution_count": 103,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "  adding: results/Attacks_distribution.svg (deflated 81%)\n",
            "  adding: results/Attacks_mapped_distribution.tif (deflated 99%)\n",
            "  adding: results/confusion_matrix_adversarial.tif (deflated 97%)\n",
            "  adding: results/confusion_matrix_keras2.tif (deflated 97%)\n",
            "  adding: results/confusion_matrix_keras_OverSampl.tif (deflated 97%)\n",
            "  adding: results/confusion_matrix_keras.tif (deflated 97%)\n",
            "  adding: results/test_adv_imp.tif (deflated 99%)\n",
            "  adding: results/test_distributio.tif (deflated 99%)\n",
            "  adding: results/train_adv.tif (deflated 96%)\n",
            "  adding: results/train_distributio.tif (deflated 99%)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "XZNLSgSMKrwW",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 50
        },
        "outputId": "def014b7-b495-43d3-b491-40d05be4dcb0"
      },
      "cell_type": "code",
      "source": [
        "!zip AE-RLmodels.zip models/*"
      ],
      "execution_count": 104,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "  adding: models/defender_agent_model.h5 (deflated 20%)\n",
            "  adding: models/defender_agent_model.json (deflated 85%)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "-u658AZkLQhA",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}